-
-
Notifications
You must be signed in to change notification settings - Fork 342
Help for configuring Mercure behind nginx as proxy-server #854
Description
Hello,
I'm deploying Mercure hub on my server (VPS hosted by OVH) where an API REST (Symfony+FOSRestBundle) and a front app (VueJS 3, vue-cli) are installed yet, served with Nginx. API and FO have their own domains (https://api.exemple.space/ and https://www.exemple.space/). I've created a domain for Mercure (https://mercure.exemple.com/). Mercure (version 0.15) is installed with binary, not with docker.
I added an nginx host configuration for working as reverse-proxy (https://mercure.rocks/docs/hub/nginx):
# should i keep these lines commented or not ?
#server {
# listen 80 http2;
# server_name mercure.exemple.space;
# return 301 https://mercure.exemple.space;
#}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name mercure.exemple.space;
ssl_certificate /etc/letsencrypt/live/mercure.exemple.space/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mercure.exemple.space/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000; # <-- is correct ?
proxy_read_timeout 24h;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 300s;
#proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Configuration des logs
access_log /var/log/nginx/mercure_access.log;
error_log /var/log/nginx/mercure_error.log;
}i set public and private keys and set them as env variables in /etc/profile.d/mercure.sh
export MERCURE_PUBLISHER_JWT_KEY=$(cat /home/me/mercure/publisher.key.pub)
export MERCURE_PUBLISHER_JWT_ALG=RS256
export MERCURE_SUBSCRIBER_JWT_KEY=$(cat /home/me/mercure/subscriber.key.pub)
export MERCURE_PUBLISHER_JWT_ALG=RS256
export SERVER_NAME=localhost:3000 # <-- mercure.exemple.space or mercure.exemple.space:3000, which one is correct ?I run with command MERCURE_PUBLISHER_JWT_KEY=$MERCURE_PUBLISHER_JWT_KEY MERCURE_SUBSCRIBER_JWT_KEY=$MERCURE_SUBSCRIBER_JWT_KEY /usr/bin/mercure run --config /home/stephane/mercure/Caddyfile
My Caddyfile :
{
{$DEBUG:debug}
{$CADDY_GLOBAL_OPTIONS}
order mercure after encode
# Ports
http_port 3001 # Should i keep this line ?
https_port 3000 # Should i keep this line ?
{$GLOBAL_OPTIONS}
}
{$CADDY_EXTRA_CONFIG}
{$SERVER_NAME:localhost} {
# tls line is commented because Mercure cant read keys, change rights/owner ?
# tls /etc/letsencrypt/live/mercure.exemple.space/fullchain.pem /etc/letsencrypt/live/mercure.exemple.space/privkey.pem
log {
format filter {
wrap console
fields {
uri query {
replace authorization REDACTED
}
}
}
}
encode zstd gzip
mercure {
# Transport to use (default to Bolt)
transport_url {$MERCURE_TRANSPORT_URL:bolt://mercure.db}
# Publisher JWT key
publisher_jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG}
# Subscriber JWT key
subscriber_jwt {env.MERCURE_SUBSCRIBER_JWT_KEY} {env.MERCURE_SUBSCRIBER_JWT_ALG}
# Extra directives
# CORS
cors_origins https://www.exemple.space https://exemple.local:8080 https://localhost:8080 <-- maybe some error here ?
publish_origins *
anonymous
subscriptions
{$MERCURE_EXTRA_DIRECTIVES}
}
{$CADDY_SERVER_EXTRA_DIRECTIVES}
respond /healthz 200
respond "Not Found" 404
}In log i have :
2024/01/03 11:07:15.053 ERROR tls.obtain could not get certificate from issuer {"identifier": "mercure.exemple.space", "issuer": "acme.zerossl.com-v2-DV90", "error": "[mercure.astro-otter.space] creating new order: attempt 1: https://acme.zerossl.com/v2/DV90/newOrder: performing request: Post \"https://acme.zerossl.com/v2/DV90/newOrder\": context deadline exceeded (Client.Timeout exceeded while awaiting headers) (ca=https://acme.zerossl.com/v2/DV90)"}
2024/01/03 11:07:15.053 DEBUG events event {"name": "cert_failed", "id": "533a237d-c07a-4cd4-a12d-dfe931a9c5aa", "origin": "tls", "data": {"error":{},"identifier":"mercure.exemple.space","issuers":["acme-v02.api.letsencrypt.org-directory","acme.zerossl.com-v2-DV90"],"renewal":false}}
2024/01/03 11:07:15.053 ERROR tls.obtain will retry {"error": "[mercure.exemple.space] Obtain: [mercure.exemple.space] creating new order: attempt 1: https://acme.zerossl.com/v2/DV90/newOrder: performing request: Post \"https://acme.zerossl.com/v2/DV90/newOrder\": context deadline exceeded (Client.Timeout exceeded while awaiting headers) (ca=https://acme.zerossl.com/v2/DV90)", "attempt": 1, "retrying_in": 60, "elapsed": 127.939511407, "max_duration": 2592000}If i run curl from my local env :
$ curl -X GET https://mercure.exemple.space/.well-known/mercure
Client sent an HTTP request to an HTTPS server.
$ curl -X GET https://mercure.exemple.space:3000/.well-known/mercure
curl: (35) error:0A000438:SSL routines::tlsv1 alert internal errorIn my JS app (from local or prod env), i have CORS error with this code :
const hubUrl = new URL('https://mercure.exemple.space');
const domain = 'https://api.exemple.space'
const topic = 'notifications/all';
hubUrl.searchParams.append('topic', `${domain}/${topic}`);
const eventSource = new EventSource(hubUrl.toString(), {withCredentials: true});
eventSource.onmessage = (event) => {
console.log(event.data);
}I need help for wrtting good configuration for Nginx and Caddyfile. I'll fix CORS errors later.
Thank you for help :)