Історичний огляд встановлення повноцінного веб-сервера на Ubuntu 12.04 LTS із панеллю ISPConfig 3. Матеріал охоплює підготовку системи, налаштування мережі, веб-сервера, PHP, MySQL, пошти, DNS, FTP, захисту від спаму та інших служб, необхідних для самостійного хостингу сайтів.
Власний сервер дозволяє самостійно керувати сайтами, базами даних, поштовими скриньками, доменами та доступом користувачів. У цьому історичному матеріалі розглядається створення такої системи на базі Ubuntu Server 12.04 LTS із панеллю керування ISPConfig 3.
ISPConfig 3 об’єднувала керування основними службами хостингу в одному веб-інтерфейсі. Через панель можна було додавати сайти, створювати FTP-користувачів, керувати базами MySQL, поштовими доменами, DNS-зонами, квотами та обліковими записами клієнтів.
Сьогодні Ubuntu 12.04 та наведені в оригінальній інструкції версії програмного забезпечення вважаються застарілими. Тому матеріал слід використовувати для ознайомлення з будовою класичного Linux-сервера, а не як готову інструкцію для сучасної робочої системи.
Підготовка до встановлення
Для розгортання сервера була потрібна інсталяційна система Ubuntu Server, стабільне підключення до інтернету та окремий комп’ютер або віртуальна машина.
Перед початком визначалися основні параметри майбутнього сервера:
ім’я хоста;
повне доменне ім’я;
постійна IP-адреса;
мережева маска;
шлюз;
DNS-сервери;
структура дисків;
ім’я адміністративного користувача.
У прикладі сервер отримував повне ім’я server1.example.com і статичну адресу в локальній мережі. У реальній конфігурації ці значення необхідно було замінити власними.
Встановлення Ubuntu Server
Після завантаження з інсталяційного носія користувач обирав мову, регіон, розкладку клавіатури та часовий пояс.
Далі встановлювач пропонував вибрати диск. Для простої системи використовувалася автоматична розмітка всього накопичувача. Вона створювала основний логічний том для системи та окремий простір підкачки.
Для сервера з великим обсягом даних або кількома дисками розділи можна було створювати вручну. Наприклад, окремо виділяти місце для системи, домашніх каталогів, журналів, баз даних і резервних копій.
Після форматування диска встановлювалася базова система. Потім створювався звичайний користувач із паролем. Використовувати для нього ім’я Admin не рекомендувалося, оскільки воно могло бути зарезервованим.
Шифрування домашнього каталогу було необов’язковим. Для серверної системи його часто не використовували, щоб уникнути додаткових складнощів під час автоматичної роботи служб.
На етапі вибору програмного забезпечення встановлювався OpenSSH Server. Інші компоненти хостингу не обиралися, оскільки їх планували додати вручну та повністю контролювати конфігурацію.
Після завершення встановлення додавався завантажувач GRUB, інсталяційний носій видалявся, а сервер перезавантажувався.
Адміністративний доступ
Після першого входу подальші дії виконувалися з підвищеними правами. Для тимчасового переходу в режим адміністратора використовувалася команда:
sudo su
Також існувала можливість задати окремий пароль для root. Проте постійний прямий вхід під root створює додаткові ризики безпеки. Для сучасних серверів краще використовувати звичайного користувача, sudo та авторизацію за SSH-ключами.
Якщо OpenSSH не був встановлений разом із системою, його можна було додати окремо. Після цього сервером керували віддалено через SSH-клієнт.
Статична мережева конфігурація
Сервер не повинен залежати від випадкової адреси, виданої DHCP. Тому мережевий інтерфейс переводився на статичну конфігурацію.
У налаштуваннях зазначалися:
IP-адреса сервера;
маска підмережі;
мережева адреса;
широкомовна адреса;
основний шлюз;
DNS-сервери.
Після збереження конфігурації мережеву службу перезапускали. Окремо редагувався файл hosts, у якому локальна адреса пов’язувалася з повним доменним і коротким іменами сервера.
Правильність налаштування перевірялася командами hostname і hostname -f. Сервер мав повертати коректне повне доменне ім’я.
Оновлення системи
Після налаштування мережі редагувався список джерел пакетів. Посилання на інсталяційний диск вимикалися, а основні репозиторії, оновлення та пакети безпеки залишалися активними.
Потім оновлювався список пакетів і встановлювалися доступні виправлення. Якщо оновлювалося ядро, систему перезавантажували.
Оригінальна інструкція також рекомендувала змінити стандартну оболонку /bin/sh із Dash на Bash через вимоги старого інсталятора ISPConfig.
У матеріалі пропонувалося повністю відключити AppArmor. Сьогодні такий підхід не варто застосовувати без крайньої необхідності. AppArmor є важливою частиною захисту системи, тому правильніше адаптувати правила безпеки до встановлених служб.
Синхронізація часу
Для правильного формування журналів, роботи пошти, SSL-сертифікатів і завдань cron встановлювалися служби синхронізації часу.
Точний час особливо важливий для поштового сервера й авторизації. Якщо годинник системи значно відстає або поспішає, можуть виникати помилки під час встановлення захищених з’єднань.
База даних і поштові служби
Наступним етапом встановлювалися MySQL, Postfix, Dovecot, OpenSSL та допоміжні інструменти.
Під час налаштування MySQL задавався пароль адміністративного користувача бази даних.
Для Postfix обирався режим інтернет-сайту, а системним поштовим іменем встановлювалося повне доменне ім’я сервера.
Dovecot забезпечував доступ до пошти через IMAP і POP3. Додаткові модулі дозволяли працювати з базою даних та правилами сортування повідомлень.
В оригінальній схемі MySQL відкривалася для прослуховування на всіх мережевих інтерфейсах. На сучасному сервері цього не слід робити без міжмережевого екрана, обмеження дозволених адрес і захищеного каналу. Для більшості сайтів достатньо локального доступу до бази.
Фільтрація спаму та вірусів
Для перевірки пошти встановлювалися Amavis, SpamAssassin і ClamAV.
SpamAssassin аналізував повідомлення на характерні ознаки спаму. ClamAV перевіряв листи та вкладення на наявність шкідливого вмісту. Amavis зв’язував ці компоненти з Postfix і передавав їм повідомлення для перевірки.
Окрему службу SpamAssassin можна було зупинити, оскільки її функції використовувалися через Amavis. Це дозволяло трохи зменшити споживання оперативної пам’яті.
Веб-сервер, PHP і phpMyAdmin
Оригінальний варіант інструкції розглядав сервер на Apache з PHP 5, FastCGI, suEXEC, модулями SSL, Rewrite та іншими компонентами.
PHP використовувався для запуску сайтів і самої панелі ISPConfig. Додатково встановлювалися модулі для роботи з MySQL, графікою, поштою, шифруванням і архівами.
phpMyAdmin надавав браузерний інтерфейс для керування базами даних. Через нього можна було створювати таблиці, виконувати SQL-запити, імпортувати резервні копії та керувати користувачами.
Для прискорення PHP у ті роки використовували XCache. Він зберігав скомпільований код у пам’яті. У сучасних версіях PHP цю функцію переважно виконує OPcache.
FTP і дискові квоти
Для FTP-доступу встановлювався PureFTPd із підтримкою користувачів MySQL.
Служба запускалася в автономному режимі, а віртуальним користувачам дозволялося працювати всередині призначених каталогів.
Оскільки звичайний FTP передає пароль і дані у відкритому вигляді, додатково налаштовувалося шифрування TLS. Для цього створювався SSL-сертифікат і обмежувалися права доступу до його приватного ключа.
Для контролю дискового простору активувалися користувацькі та групові квоти. Вони дозволяли ISPConfig обмежувати, скільки місця може використовувати конкретний сайт або обліковий запис.
DNS і статистика
Для обслуговування DNS-зон встановлювався BIND. Через нього ISPConfig могла створювати записи доменів, піддоменів, поштових серверів та інших служб.
Для збору статистики використовувалися Vlogger, Webalizer і AWStats. Вони обробляли журнали веб-сервера та формували звіти про відвідування сайтів.
Jailkit застосовувався для ізоляції SSH-користувачів. Його потрібно було встановлювати до ISPConfig, оскільки пізніше панель вже не могла повноцінно інтегрувати його в готову систему.
Веб-пошта
Для роботи з поштою через браузер встановлювався SquirrelMail.
У налаштуваннях вибирався Dovecot як IMAP-сервер. Після збереження конфігурації користувачі могли відкривати свої поштові скриньки без окремої поштової програми.
Сьогодні SquirrelMail вважається застарілим рішенням. На нових серверах частіше використовують сучасні веб-клієнти, наприклад Roundcube.
Роль ISPConfig 3
Після встановлення всіх необхідних компонентів ISPConfig об’єднувала їх у спільну систему керування.
Адміністратор отримував можливість:
створювати клієнтів і користувачів;
додавати сайти та піддомени;
керувати базами даних;
створювати FTP-акаунти;
налаштовувати поштові домени та скриньки;
редагувати DNS-зони;
встановлювати дискові квоти;
керувати статистикою;
ізолювати користувачів;
контролювати основні серверні служби.
Головною перевагою було те, що більшість повсякденних операцій виконувалася через браузер, без ручного редагування десятків конфігураційних файлів.
Безпека за сучасними вимогами
Описана конфігурація відображає практику початку минулого десятиліття. Для сучасного сервера її потрібно суттєво переглянути.
Необхідно використовувати підтримувану LTS-версію Ubuntu, актуальні PHP, MariaDB або MySQL, веб-сервер, поштові служби та свіжу версію ISPConfig.
Також потрібно:
закрити невикористовувані порти;
налаштувати UFW або інший міжмережевий екран;
захистити SSH ключами;
заборонити прямий вхід root;
увімкнути Fail2ban;
використовувати сучасні TLS-сертифікати;
регулярно оновлювати систему;
зберігати резервні копії поза сервером;
не відкривати MySQL для всього інтернету;
не вимикати AppArmor без обґрунтованої причини;
контролювати права файлів і каталогів.
Підсумок
Ubuntu Server 12.04 LTS та ISPConfig 3 дозволяли створити повноцінну платформу для самостійного хостингу сайтів, пошти, FTP, DNS і баз даних.
Матеріал добре показує, як окремі служби Linux об’єднуються в єдину серверну інфраструктуру. Операційна система забезпечує основу, веб-сервер приймає запити, PHP запускає динамічні сайти, база даних зберігає інформацію, поштові служби обробляють листи, а ISPConfig спрощує адміністрування.
Практичні команди й версії програм з оригінальної інструкції вже застаріли, але сама архітектура залишається корисною для розуміння роботи веб-хостингу.
{"site_name":"my-dark-master","site_description":"News, posts, articles, files and community projects.","page_not_found":"Page not found","home":"Home","content_not_found":"Content not found","materials":"Content","login":"Sign in","login_action":"Sign in","logout":"Sign out","register":"Register","forgot_password":"Forgot password?","restore_password":"Restore password","email":"Email","password":"Password","name":"Name","nickname":"Username","profile":"My profile","save_profile":"Save profile","theme":"Theme","theme_dark":"Dark","theme_light":"Light","search_placeholder":"Search the site...","search":"Search","change_theme":"Change theme","news":"News","lib":"Articles","post":"Posts","communities":"Communities","community":"Community","main_community":"Main community","community_role_owner":"Owner","community_role_admin":"Administrator","community_role_moderator":"Moderator","community_role_author":"Author","community_role_subscriber":"Member","community_status_pending":"Pending moderation","community_status_revision":"Needs revision","community_status_approved":"Approved","community_status_rejected":"Rejected","community_status_blocked":"Blocked","community_status_archived":"Archived","community_not_found":"Community not found","communities_empty":"There are no communities yet.","comments":"Comments","comments_sort":"Comment sorting","comments_new":"Newest","comments_best":"Best","comments_old":"Oldest","mail":"Mail","sections":"Sections","publications":"publications","materials_count":"items","empty_section":"There are no publications in this section yet.","back_to_section":"Back to section","read_more":"Read more","comment":"Comment","send":"Send","to_home":"Home","open_login_menu":"Open sign-in menu","open_profile_menu":"Open profile menu","language":"Language","menu":"Menu","categories":"Categories","genre":"Genre","section_disabled":"This section is temporarily disabled.","footer_sections":"Sections","footer_social":"Social networks","footer_info":"Information","comments_empty":"No comments yet.","comments_login_required":"Register and sign in to add comments.","pagination":"Pagination","pagination_back":"Back","pagination_next":"Next","admin_panel":"Control panel","admin_panel_hint":"Site management","admin_dashboard":"Dashboard","admin_add_news":"Add news","admin_add_post":"Add post","admin_add_lib":"Add article","admin_all_materials":"All content","admin_categories":"Material categories","admin_settings":"Site settings","admin_profile":"Admin settings","admin_content":"Content","admin_comments":"Comments","admin_users":"Users","admin_system":"System","admin_add_material":"Add","admin_edit_material":"Edit","admin_content_title":"Title","admin_content_genre":"Genre","admin_content_summary":"Summary","admin_content_body":"Full text","admin_content_status":"Status","admin_content_poster":"Poster","admin_category":"Category","admin_category_none":"No category","admin_content_publish":"Add content","admin_content_save":"Save changes","status_moderation":"Pending moderation","status_published":"Published","status_fixed":"Pinned and published","enabled":"Enabled","disabled":"Disabled","all":"All","section":"Section","date":"Date","delete":"Delete","add":"Add","open":"Open","save":"Save","cancel":"Cancel","admin_group":"Group","admin_group_settings":"Group settings","admin_group_settings_hint":"Groups use fixed IDs from 1 to 5. The super admin always has full access.","admin_groups_saved":"Group settings saved.","admin_groups_error":"Unable to save group settings.","group_superadmin":"Super admin","group_superadmin_hint":"Full access to all functions and settings.","group_admin":"Admin","group_admin_hint":"Site management without changing super-admin rights.","group_moderator":"Moderator","group_moderator_hint":"Content and moderation tools.","group_user":"User","group_user_hint":"Regular registered user.","group_guest":"Guest","group_guest_hint":"Visitor without access to the control panel.","permission_panel_access":"Access the control panel","permission_content_manage":"Add and edit content","permission_categories_manage":"Manage shared categories","permission_users_manage":"Manage users","permission_groups_manage":"Change group settings","permission_settings_manage":"Change site settings","admin_users_hint":"Assign one of the five groups to registered users.","admin_user_search":"Username or email","admin_users_empty":"No users found.","admin_user_not_found":"User not found.","admin_group_self_change_denied":"You cannot change your own group from the panel.","admin_superadmin_only":"Only a super admin can manage the super-admin group.","admin_last_superadmin":"The last super admin cannot be removed.","admin_user_group_saved":"The user group has been changed.","admin_you":"You","admin_permission_denied":"Your group is not allowed to perform this action.","admin_panel_limited":"Panel access is allowed, but your group cannot manage content.","created_at":"Registered","action":"Action","admin_invalid_login":"Incorrect password or this account cannot access the control panel.","admin_logged_without_access":"You are signed in as %s, but your group cannot access the control panel.","admin_my_settings":"My settings","admin_general_tab":"General","admin_security_tab":"Security","admin_nickname_locked":"Changing the username in the panel is disabled.","admin_users_section":"Users","admin_system_settings":"System","admin_optional":"optional","admin_poster_choose":"Choose image","admin_poster_hint":"JPG, PNG, GIF or WEBP up to 5 MB","news_navigation":"News navigation","post_navigation":"Post navigation","lib_navigation":"Article navigation","all_categories":"All materials","admin_categories_hint":"Categories are separated by material type and do not mix with each other.","admin_categories_all":"All categories","admin_category_add":"Add category","admin_category_edit":"Edit category","edit":"Edit","view_mode":"Content view","view_list":"List","view_grid":"Grid","search_results":"Search results","search_query":"Query","search_empty":"Nothing found.","profile_home":"Profile home","profile_avatar":"Avatar","profile_my":"My profile","profile_security":"Security","profile_welcome":"My profile","profile_avatar_change":"Change avatar","choose_avatar":"Choose image","save_avatar":"Save avatar","avatar_upload_disabled":"Avatar uploads are disabled.","avatar_required":"Choose an image.","avatar_too_large":"The image is larger than 5 MB.","avatar_invalid_type":"JPG, PNG, GIF and WEBP are allowed.","avatar_save_failed":"Could not save the avatar. Check permissions for \/img\/avatar.","avatar_saved":"Avatar saved.","search_show_all":"Show all","captcha_label":"Verification: solve the example","captcha_required":"Enter the answer to the verification example.","captcha_invalid":"The CAPTCHA answer is incorrect. Please try again.","registration_bot_blocked":"Registration was rejected by the anti-bot protection. Refresh the form and try again.","registration_ip_exists":"An account has already been registered from this IP address.","ok":"OK","reset_password":"Reset password","change_password":"Change password","new_password":"New password","current_password":"Current password","password_change":"Password change","update_password":"Update password","theme_saved":"Theme saved.","field_required":"Complete the required fields.","email_invalid":"Enter a valid email address.","password_min":"The password must contain at least 6 characters.","name_required":"Enter a username.","form_sent":"Data sent.","close_notification":"Close notification","logout_success":"You have signed out.","register_success":"Registration completed successfully.","invalid_login":"Incorrect email or password.","invalid_register":"Enter a username, valid email and a password of at least 6 characters.","registration_disabled":"Registration is temporarily disabled.","email_exists":"A user with this email already exists.","name_exists":"A user with this username already exists.","profile_required":"Username and email are required.","email_busy":"This email is already in use.","name_busy":"This username is already in use.","profile_saved":"Profile saved.","password_check_failed":"Check your current password. The new password must contain at least 6 characters.","password_changed":"Password changed.","mail_new":"New message","mail_inbox":"Inbox","mail_sent_folder":"Sent","mail_spam":"Spam","mail_to":"To (username)","mail_subject":"Subject","mail_body":"Message","mail_files":"Files","mail_send":"Send message","mail_refresh":"Refresh","mail_block":"Block sender","mail_close":"Close mail","mail_empty":"No messages yet.","mail_select":"Select a message from the list.","mail_required":"Enter a recipient and message.","mail_recipient_not_found":"No user with that username was found.","mail_self_denied":"You cannot send a message to yourself.","mail_limit_messages":"The monthly message limit has been reached.","mail_limit_attachments":"The monthly attachment limit has been reached.","mail_sent":"Message sent.","mail_not_found":"Message not found.","mail_blocked":"The user was added to your block list.","mail_system":"System","mail_welcome_subject":"Welcome","mail_welcome_body":"Hello, {name}.\n\nYour login: {email}","mail_server_error":"Server error.","mail_network_error":"Network error.","mail_error":"Mail error.","mailbox_full":"The user\u2019s mailbox is full.","mail_add_files":"Add files","mail_download":"download","added":"Added","reading_now":"Reading now","views":"Views","views_page_title":"Views","views_back_material":"Back to content","views_today":"Today","views_7_days":"Last 7 days","views_30_days":"Last 30 days","views_registered":"Users","views_guests":"Guests","views_repeat_note":"A repeat view by the same visitor is counted after the interval configured in the site settings.","views_last":"Last view","category":"Category","material_rating":"Content rating","author_rating":"Rating","bookmark":"Bookmark","profile_bookmarks":"My bookmarks","bookmarks_all":"All","bookmarks_empty":"There are no bookmarks in this section yet.","bookmark_remove":"Remove from bookmarks","bookmarked_at":"Added","share":"Share","subscribe":"Subscribe","subscribed":"Subscribed","login_required":"Sign in to vote.","delete_comment":"Archive comment","comment_deleted":"Comment archived.","comment_not_found":"Comment not found.","comment_added":"Comment added.","comment_required":"Enter a comment.","comment_too_long":"The comment is too long.","comments_disabled":"Comments are disabled for this section.","account_banned":"Your account is blocked.","reason":"Reason","ban_until":"Until","forever":"Permanent","wait_seconds":"Wait %d seconds.","daily_limit_reached":"The daily limit has been reached.","admin_category_created":"Category added.","admin_category_deleted":"Category archived.","admin_category_error":"The category could not be saved. Check the name and URL.","admin_category_not_found":"Category not found.","admin_category_required":"Enter the Ukrainian category name.","admin_category_updated":"Category updated.","admin_content_created":"Content added.","admin_content_deleted":"Content archived.","admin_content_empty":"No content yet.","admin_content_manage_hint":"Only sections allowed for your group are shown.","admin_content_not_found":"Content not found.","admin_content_required":"Enter the Ukrainian title and full text.","admin_content_save_error":"The content could not be saved.","admin_content_updated":"Content updated.","admin_forbidden":"Your group cannot access the control panel.","admin_login":"Control panel sign in","admin_login_action":"Sign in","admin_login_success":"You signed in to the control panel.","admin_profile_saved":"Profile settings saved.","admin_select_material":"Content not found.","admin_settings_error":"The settings could not be saved.","admin_settings_saved":"Site settings saved.","admin_theme_saved":"Control panel theme changed.","already_have_account":"Already have an account?","back_to_login":"Back to sign in","check_mail":"Check your email","engine_version":"Engine version","forgot_done_text":"If the address exists, recovery instructions were sent by email.","forgot_help":"Enter the email address used during registration.","get_link":"Get link","invalid_reset":"The recovery link is invalid or expired.","local_test_link":"Local test link","login_too_many":"Too many sign-in attempts. Try again later.","mod_not_found":"Module not found.","not_found_text":"The requested page was not found.","password_changed_login":"Password changed. Sign in with the new password.","permission_denied":"You do not have permission for this action.","rating_disabled":"Rating is disabled for this content.","required_language":"required language","reset_open_link":"Open password recovery","reset_sent":"The recovery link was sent.","too_many_requests":"Too many requests. Try again later.","vote_saved":"Your vote was saved.","invalid_vote":"Invalid vote value."}
Comments