Я только что создал новый проект Laravel 8, следуя инструкциям в их документах . Используя Laravel Sail У меня есть сайт, работающий локально на моей машине, с использованием sail up. Я настроил запись в /etc/hosts, поэтому я перехожу по URL-адресу http://local.dev.domain.com (заменяя domain.com фактическое доменное имя, которым я владею, и указывая на localhost в файле /etc/hosts)... все работает отлично.
Однако сайт должен использовать вход через Facebook, а Facebook требует URL-адреса https только для рефереров. Я пробовал все, что мог найти в Интернете о настройке SSL-сертификатов с помощью докера, но настройка nginx с сертификатами, созданными вручную (через mkcert), или попытка использовать letsencrypt не увенчались успехом по разным причинам (конфликты в портах, letsencrypting хочет, чтобы домен был настоящий (и не справится с acme, если я создам этот субдомен) и т. д. Я скопировал сертификаты в /etc/ssl/certs в образе докера и запустил update-ca-certificates, попытался установить порт приложения 443 в моем .env файле, а также открыть оба порта 80 и 443 в файле docker-compose.yml... но все заканчивается тем, что браузер отклоняет запрос к https://local.dev.domain.com
Я потратил часы, пытаясь заставить это работать, но похоже, что никто не использовал образ докера Laravel Sail с SSL.
Любые указатели?
[Изменить для получения дополнительной информации]
Как указано в комментариях, вам нужно установить псевдоним, чтобы просто использовать sail ..., но я уже сделал это:
Я также пробовал без псевдонима bash, используя vendor/bin/sail share, но безрезультатно:






В вашем случае нужен реальный домен, который у вас есть. Самоподписанный сертификат не будет работать, так как Facebook не признает его доверенным. Чтобы получить бесплатный ssl-сертификат для этого домена, вы можете использовать Let's Encrypt, самый простой способ получить этот сертификат — использовать certbot. Проблема в том, что вам нужно установить этот сертификат на свой веб-сервер. Laravel Sail использует встроенный веб-сервер , который, к сожалению, не поддерживает ssl. Вам нужно поставить перед приложением веб-сервер типа nginx и установить туда сертификат.
В настоящее время я работаю над форком, который позволяет то, что вам нужно, однако он еще не закончен.
На данный момент вы можете использовать встроенный туннель, предоставленный Expose: https://beyondco.de/docs/expose/server/ssl
Это включено sail share
Вместо этого может быть проще использовать ngrok, что по сути то же самое, но коммерческое. Все, что вам нужно сделать, это загрузить, зарегистрироваться и запустить ngrok http --region=eu 9000, и он создаст для вас ссылку https для разработки.
Это супер полезно, спасибо! Я буду держать на вашей вилке, звучит действительно многообещающе! Я пытался использовать sail share, но получаю сообщение об ошибке, говорящее, что это недопустимая команда...
@smenzer Вам нужно правильно установить парус, чтобы использовать этот короткий псевдоним: laravel.com/docs/8.x/sail#configuring-a-bash-alias в противном случае вам нужно vendor/bin/sail share
Я сделал то, что вы упомянули (обновил описание с подробностями), но все равно не получилось vendor/bin/sail share
@smenzer, возможно, это невозможно в Windows. Однако я предлагаю пропустить эту часть и пока использовать ngrok.
Я на маке. но сейчас я пытаюсь использовать ngrok. Мне пришлось изменить порт приложения в .env на 9000, и тогда он, кажется, работает и дает мне доступ по https. Так же нужно проработать интеграцию с фейсбуком. с нетерпением жду готовности вашего проекта!
@smenzer Я пропустил, что контейнер докеров меняет порт на 80 вместо обычного порта 9000 при запуске php artisan serve
@onlineThomas дополнительный удар по форку, над которым вы работаете! звучит здорово!
@smenzer Я только что видел это в другом посте. Судя по всему, версия паруса, которую вы получаете по умолчанию, не самая последняя, вам нужно использовать composer require laravel/sail --dev, найденный в комментариях здесь laracasts.com/series/whats-new-in-laravel-8/episodes/12
Чтобы заставить работать «sail share», вам нужно установить псевдоним и запустить «composer require laravel/sail --dev» в вашем проекте. Это установит последнюю версию паруса, версия 0.0.6 включает команду «поделиться».
это помогло. странно, что документированный способ запуска проекта laravel (curl -s https://laravel.build/example-app | bash с laravel.com/docs/8.x/installation#getting-started-on-macos) не включает это по умолчанию
Sail — это необязательная среда разработки, такая как Laragon или Valet и т. д.
Просто обратите внимание, что Sail теперь включен по умолчанию при использовании онлайн-конструктора. Если вы хотите углубиться в конфиги, вы можете использовать artisan publish:sail.
Я решил эту проблему, используя Caddy в качестве обратного прокси-сервера для контейнера Laravel Sail. Caddy имеет функцию под названием автоматический HTTPS, которая может генерировать локальные сертификаты на лету.
1 - Добавьте Caddy в качестве услуги в свой docker-compose.yml
services:
caddy:
image: caddy:latest
restart: unless-stopped
ports:
- '80:80'
- '443:443'
volumes:
- './docker/Caddyfile:/etc/caddy/Caddyfile'
- sailcaddy:/data
- sailcaddy:/config
networks:
- sail
# Remove "ports" from laravel.test service
volumes:
sailcaddy:
driver: local
2 - Создайте простой Caddyfile и настройте его как обратный прокси
{
on_demand_tls {
ask http://laravel.test/caddy-check
}
local_certs
}
:443 {
tls internal {
on_demand
}
reverse_proxy laravel.test {
header_up Host {host}
header_up X-Real-IP {remote}
header_up X-Forwarded-For {remote}
header_up X-Forwarded-Port {server_port}
header_up X-Forwarded-Proto {scheme}
health_timeout 5s
}
}
3 - Настройте конечную точку для Caddy, чтобы авторизовать, для каких доменов он генерирует сертификаты.
<?php
namespace App\Http\Controllers;
use App\Store;
use Illuminate\Http\Request;
class CaddyController extends Controller
{
public function check(Request $request)
{
$authorizedDomains = [
'laravel.test',
'www.laravel.test',
// Add subdomains here
];
if (in_array($request->query('domain'), $authorizedDomains)) {
return response('Domain Authorized');
}
// Abort if there's no 200 response returned above
abort(503);
}
}
См. эту суть для полного изменения кода. Этот пост в блоге объясняет, как доверять корневым сертификатам Caddy.
Это выглядит действительно многообещающе! Мне интересно, не пропустил ли я что-нибудь; настройка выше с новой установкой (через curl -s "https://laravel.build/example-app" | bash) и настройка laravel.test на example-app.test, а затем попытка достижения example-app.test возвращает «Этот сайт не может обеспечить безопасное соединение \ example-app.test отправил недопустимый ответ. \ ERR_SSL_PROTOCOL_ERROR» в Chrome, и подобные ошибки в Safari/FF. Есть предположения?
Вы имеете в виду, что изменили laravel.test в своем docker-compose.yml? Если это так, я не думаю, что вы можете изменить laravel.test, поскольку я думаю, что Sail использует его внутри. Но вы можете обновить файл hosts, чтобы использовать любой локальный домен, который вы хотите. Вы также можете проверить журналы службы кэдди, чтобы узнать, что она делает.
Ах интересно! Да, журналы службы Caddy показали, что он работает, но даже не подтверждает запрос, когда я его делал в браузере. Попробую еще раз с laravel.test. Ваше здоровье!
Я сделал, как вы сказали, даже домен в файле hosts для laravel.test, но я все равно получаю This site can’t provide a secure connection laravel.test sent an invalid response. в браузере Chrome
Это аккуратно и это работает! Как мы можем заставить сервер разработки веб-пакета Laravel Mix также использовать обратный прокси-сервер React Fast Refresh или HRM на другом порту? Например http://localhost:8081.
Я все это сделал, установил rootCA, скопировав его в /etc/local/share/ca-certificates и запустив sudo update-ca-certificates (у меня Ubuntu). Однако при посещении laravel.test chrome по-прежнему выдает NET::ERR_CERT_AUTHORITY_INVALID. Есть идеи? Кажется, что дата истечения срока действия равна дате выпуска...
Для тех, у кого возникли проблемы с установкой rootCA, а Chrome по-прежнему выдает NET::ERR_CERT_AUTHORITY_INVALID: экспортируйте сертификат Caddy rootCA и импортируйте его в chrome, используя его настройки (chrome://settings/certificates). Так что делайте sudo docker cp your-caddy-container-name:/config/caddy/pki/authorities/local/root.crt ~/Downloads/caddy-root.crt (может быть, вам придется сделать sudo chown your-user:your-user ~/Downloads/caddy-root.crt). А затем импортируйте этот экспортированный сертификат как «Авторитет» в настройках Chrome (отметьте все флажки). НЕ ДЕЛАЙТЕ ЭТОГО С ДРУГИМИ СЕРТИФИКАТАМИ!
Я пытался заставить это решение работать в течение нескольких дней. Настройка достаточно проста, но Caddy не может проверить домены, потому что это создает петлю перенаправления. Caddy отправляет запрос на http://laravel.test/caddy-check, который затем перенаправляет на https://laravel.test/caddy-check, что приводит к сбою запроса с ошибкой following http redirects is not allowed. Поскольку, по-видимому, нет способа исключить эту единственную конечную точку, все решение является ложным.
На самом деле есть более простой способ. Я сделал следующее:
изменил порт laravel.test на что-то другое, например 8085 делайте это из .env, чтобы избежать проблем, добавьте APP_PORT env var
затем (этот шаг был выполнен нашим системным администратором), поскольку laravel Sailing фактически устанавливает apache в систему, вы можете вручную установить обратный прокси-сервер для портов 80 и 443 на порт 8085, и это должно помочь.
конечно, вам придется установить certbot на этот экземпляр apache.
попробуйте это laravel.com/docs/8.x/sail#sharing-your-site