I am creating an API, and i'm having an issue sending updates to Mercure Hub with symfony 7. I have follow the Symfony current doc and implement Mercure with docker(only mercure). in my local, all working fine, i send update, but in production, it's failed to send update. The error return me "Failed to send an update." and "HTTP/2 404 returned for "https://example.com/.well-known/mercure"." this route is the MERCURE_URL setting in the env variable. I'm using ec2 AWS Linux Machine and i don't use any domaine or SSL certificate, i only use the IP of the Linux Machine to connect. I also use Apache server. Error Images : Here is my files like in the symfony current doc : compose.override.yaml
version: '3'
services:
###> symfony/mercure-bundle ###
mercure:
ports:
- "80"
###< symfony/mercure-bundle ###
docker-compose.yaml
services:
###> symfony/mercure-bundle ###
mercure:
image: dunglas/mercure
restart: unless-stopped
environment:
SERVER_NAME: ':80'
MERCURE_PUBLISHER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!'
MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!'
# Set the URL of your Symfony project (without trailing slash!) as value of the cors_origins directive
MERCURE_EXTRA_DIRECTIVES: |
cors_origins http://127.0.0.1:8000
# Comment the following line to disable the development mode
command: /usr/bin/caddy run --config /etc/caddy/Caddyfile.dev
volumes:
- mercure_data:/data
- mercure_config:/config
###< symfony/mercure-bundle ###
volumes:
###> symfony/mercure-bundle ###
mercure_data:
mercure_config:
###< symfony/mercure-bundle ###
.env
###> symfony/mercure-bundle ###
# See https://symfony.com/doc/current/mercure.html#configuration
# The URL of the Mercure hub, used by the app to publish updates (can be a local URL)
MERCURE_URL=https://example.com/.well-known/mercure
# The public URL of the Mercure hub, used by the browser to connect
MERCURE_PUBLIC_URL=https://example.com/.well-known/mercure
# The secret used to sign the JWTs
MERCURE_JWT_SECRET="!ChangeThisMercureHubJWTSecretKey!"
###< symfony/mercure-bundle ###
config/packages/mercure.yaml
mercure:
hubs:
default:
url: '%env(MERCURE_URL)%'
public_url: '%env(MERCURE_PUBLIC_URL)%'
jwt:
secret: '%env(MERCURE_JWT_SECRET)%'
publish: '*'
my Apache configuration /etc/apache2/sites-available/taxis-chrono.conf
<VirtualHost *:80>
ServerName localhost
# Uncomment the following line to force Apache to pass the Authorization
# header to PHP: required for "basic_auth" under PHP-FPM and FastCGI
#
# SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
# <FilesMatch \.php$>
# when using PHP-FPM as a unix socket
# SetHandler proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://dummy
# when PHP-FPM is configured to use TCP
# SetHandler proxy:fcgi://127.0.0.1:9000
# </FilesMatch>
DocumentRoot /var/www/taxis-chrono/public
<Directory /var/www/taxis-chrono/public>
AllowOverride None
Require all granted
FallbackResource /index.php
</Directory>
# uncomment the following lines if you install assets as symlinks
# or run into problems when compiling LESS/Sass/CoffeeScript assets
# <Directory /var/www/project>
# Options FollowSymlinks
# </Directory>
ErrorLog /var/log/apache2/taxis-chrono_error.log
CustomLog /var/log/apache2/taxis-chrono_access.log combined
</VirtualHost>
Need help please.
I finaly found for the solution after days of searching. It is my mercure docker who was the matter. It was starting up but does not comunicate with the symfony app. What i do is to setting up the port in my compose.override.yaml like this:
services:
###> symfony/mercure-bundle ###
mercure:
ports:
- "3000:80"
###< symfony/mercure-bundle ###
and in my .env, i change the MERCURE_URL and like this :
# See https://symfony.com/doc/current/mercure.html#configuration
# The URL of the Mercure hub, used by the app to publish updates (can be a local URL)
MERCURE_URL=http://127.0.0.1:3000/.well-known/mercure
# The public URL of the Mercure hub, used by the browser to connect
MERCURE_PUBLIC_URL=http://127.0.0.1:3000/.well-known/mercure
# The secret used to sign the JWTs
MERCURE_JWT_SECRET="!ChangeThisMercureHubJWTSecretKey!"
###< symfony/mercure-bundle ###
and now all work fine, my symfony app and my Mercure in docker communicate efficiently. I hope this answer will help some body else.