Решил я тут своё портфолио сделать на Laravel 7. Чтобы главная страница была лендингом, а всю информацию на ней можно было менять с помощью админки. Не суть. Дело дошло до деплоя. Нашел пару хороших туториалов, как это сделать на полноценном сервере со всеми заморочками. В деплое я не очень силен, я вообще больше фронт, чем фулстек. И, если писать и тестить на PHP я еще могу, то до управления сервером и т.п. я еще не дорос. Но пришлось разбираться. Сейчас пройдемся по всем шагам, начиная с запуска через SSH и заканчивая рабочим сайтом. Постараемся обойти все подводные камни. Возможно, вы сможете найти аналогичные инструкции в интернете. Ведь я же в конце концов нашел. Правда не в одном месте, не без помощи StackOverflow и вряд ли на русском. Я помучился. Поэтому решил вам жизнь упростить. Делать мы всё будем с дроплетом на DigitalOcean. Это, конечно, необязательно, выбирайте любой хостинг. Дойдете до рабочего сервера на Ubuntu, возвращайтесь. Для тех, кто все же решил делать на DigitalOcean, будут еще советы по настройке домена. А также реферальная ссылка на 100$. Начнем. sudo apt update sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https sudo apt-add-repository ppa:ondrej/php sudo apt update 7.3: sudo apt install -y php7.3-fpm php7.3-mysql 7.4: sudo apt install -y php7.4-fpm php7.4-mysql sudo vim /etc/nginx/sites-available/<Ваш домен> Базовая настройка: Только HTTP настройка под Laravel: HTTPS настройка под Laravel: 7.3: sudo apt install -y php7.3-mbstring php7.3-xml composer unzip 7.4: sudo apt install -y php7.4-mbstring php7.4-xml composer unzip mysql -u root -p CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>'; FLUSH PRIVILEGES; exit cd /var/www/html sudo mkdir -p <Имя проекта> sudo chown laravel:laravel <Имя проекта> cd ./<Имя проекта> git clone <ссылка на проект> . / git clone -b <имя ветки> --single-branch <ссылка на проект> . composer install vim .env php artisan migrate php artisan key:generate sudo chown -R $USER:www-data storage sudo chown -R $USER:www-data bootstrap/cache chmod -R 775 storage chmod -R 775 bootstrap/cache sudo add-apt-repository ppa:certbot/certbot sudo apt install -y python-certbot-nginx sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен> sudo nginx -t sudo ufw allow 'Nginx HTTPS' sudo ufw status sudo systemctl reload nginx Все действия далее, до конца статьи, мы проводим от имени пользователя laravel. Поэтому, если вы вдруг прервались, перезайдите и введите su laravel Мы открыли файл в Vim. Если вы с ним не знакомы вообще, можете работать в Nano, ваше право. Для того, чтобы по ходу статьи пользоваться редактором Vim, вам достаточно знать следующее. Все в порядке. При установке вас иногда будет спрашивать "Вы уверены?". Отвечайте y (ну только, если уверены). Добавляем Nginx в настройки фаервола Перейдите по вашему IP. Если все идет хорошо, вы должны увидеть следующее.  Ответьте на поставленные вопросы. Если вы не знаете, что отвечать, вот рекомендуемые варианты: Validate password plugin — N Remove anonymous users? — Y Disallow root login remotely? — N Remove test database and access to it? — N Reload privilege tables now? — Y Заходим в MySQL: sudo mysql Смотрим методы доступа: SELECT user,authentication_string,plugin,host FROM mysql.user; Устанавливаем пароль для root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>'; Смотрим методы доступа снова: SELECT user,authentication_string,plugin,host FROM mysql.user; Применяем изменения и выходим из MySQL: FLUSH PRIVILEGES; и exit Теперь, чтобы войти в MySQL нужно использовать mysql -u root -p и вводить пароль Воспользуемся сторонним репозиторием от Ondřej Surý Теперь выбираем. Для Laravel 7 можно выбрать PHP 7.3 или 7.4. Отличие будет лишь в цифрах 3 и 4. PHP FastCGI Process Manager (fpm) работает с PHP запросами. mysql, естественно, для работы с MySQL. Дальше я все буду делать на 7.4. Вместо "<Ваш домен>" впишите домен (например, mysite.ru), который хотите использовать в будущем. Если у вас такого пока нет, пишите любой, потом просто повторите действия в этой главе для своего домена, когда выберите его. Вписываем следующее: Если Вы выбрали версию 7.3 вместо php7.4-fpm.sock впишите php7.4-fpm.sock. Слушаем 80 порт на server_name, когда приходим запрос в корне /var/www/html берем index-файл. Если после server_name что-то есть, ищем такой файл. Не находим, выбрасываем 404. Если заканчивается на .php, прогоняем через fpm. Если есть .ht, запрещаем (403). Проверяем работу: Вы должны увидеть что-то подобное:  Теперь этот файл можно удалить: sudo rm /var/www/html/info.php 7.3: sudo apt install php7.3-mbstring php7.3-xml composer unzip 7.4: sudo apt install php7.4-mbstring php7.4-xml composer unzip Заходим в MySQL: mysql -u root -p Создаем БД с именем laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; Предоставляем root доступ к laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>'; FLUSH PRIVILEGES; exit cd /var/www/html Создаем папку для проекта: sudo mkdir -p <Имя проекта> Предоставляем пользователю laravel права на проект: sudo chown laravel:laravel <Имя проекта> Далее нужно перенести проект. Например, клонированием с Github. Стоит учитывать, что, если вы не сохраняли статические файлы (например, из /public) на Github, то их у вас, естественно, не будет. Я, например, для решения этого создал отдельную ветку deploy, из которой уже и клонировал: git clone -b <имя ветки> --single-branch <ссылка на проект> .. Базовая версию его выглядит так: Если вы копируете свой .env, замените APP_ENV на production, APP_DEBUG на false и впишите правильные настройки для MySQL. Меняем разрешения: Последнее, что осталось, – перенастроить Nginx под Laravel: sudo vim /etc/nginx/sites-available/<Ваш домен> Как и в прошлый раз, если Вы выбрали версию 7.3 вместо php7.4-fpm.sock впишите php7.4-fpm.sock. Устанавливаем certbot и передаем ему имя домена (формата mysite.ru) и имя домена с www (www.mysite.ru). Теперь надо перенастроить Nginx (не забудьте подставить свои значения): Думаю, вы уже поняли, что нужно поменять для PHP 7.3. Тут, на самом деле, все просто. Мы просто перенаправляем все запросы с HTTP (порт 80) на HTTPS (порт 443). А там делаем все тоже самое, что и раньше, но уже с шифрованием. Осталось поставить разрешения в фаерволе: Теперь все должно работать, как надо. Если вдруг вам понадобилось запускать npm-команды прямо на сервере, вам нужно установить Node.js. Всё, я остановился на этом этапе. В принципе, результат меня устраивает. Возможно, я перейду с DigitalOcean куда-нибудь поближе к России и подешевле. Но так как я уже прошел все круги верификации на сайте и всё делал там, я показывал на их примере. К тому же их стартовые 100 долларов – отличный плацдарм для тренировок. P.S. Отдельная благодарность автору вот этого гиста, который послужил основой всех вышеперечисленных действий. Он в некоторых моментах не работает для Laravel 7, я это поправил. P.P.S. Если вы вдруг топовый инженер, который думает командами из bash, пожалуйста, не судите строго. Возможно, вам уровень этой статьи покажется низковатым, но я был бы рад найти такую, когда она мне была нужна. Если есть предложения по улучшению, я обеими руками "за". Web-разработчик