HMR in docker not working when using reverse proxy
When using the docker and caddy revers proxy the hmr is not working , but if I don't use reverseproxy only docker it works fine.
chrome error in console
here is my caddfile
here is the nuxtconfig
Thank you in advance
client:535 Mixed Content: The page at 'https://nuxtnew.larabells.local/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://nuxtnew.larabells.local:443/_nuxt/'. This request has been blocked; this endpoint must be available over WSS.
setupWebSocket @ client:535
(anonymous) @ client:530
client:532 [vite] failed to connect to websocket (SecurityError: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.).
client:535 Mixed Content: The page at 'https://nuxtnew.larabells.local/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://nuxtnew.larabells.local:443/_nuxt/'. This request has been blocked; this endpoint must be available over WSS.
setupWebSocket @ client:535
(anonymous) @ client:530
client:532 [vite] failed to connect to websocket (SecurityError: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.).
nuxtnew.larabells.local {
@websockets {
header Connection *Upgrade*
header Upgrade websocket
}
reverse_proxy @websockets nuxtnew_container:24678
reverse_proxy nuxtnew_container:4000
}
nuxtnew.larabells.local {
@websockets {
header Connection *Upgrade*
header Upgrade websocket
}
reverse_proxy @websockets nuxtnew_container:24678
reverse_proxy nuxtnew_container:4000
}
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
compatibilityDate: '2024-04-03',
devtools: { enabled: false },
devServer: {
port: 4000,
host: '0.0.0.0',
},
vite: {
server: {
hmr: {
protocol: 'wss',
clientPort: 443,
},
},
},
modules: ["@nuxtjs/tailwindcss", "shadcn-nuxt"],
shadcn: {
/**
* Prefix for all the imported component
*/
prefix: '',
/**
* Directory that the component lives in.
* @default "./components/ui"
*/
componentDir: './components/ui'
}
})
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
compatibilityDate: '2024-04-03',
devtools: { enabled: false },
devServer: {
port: 4000,
host: '0.0.0.0',
},
vite: {
server: {
hmr: {
protocol: 'wss',
clientPort: 443,
},
},
},
modules: ["@nuxtjs/tailwindcss", "shadcn-nuxt"],
shadcn: {
/**
* Prefix for all the imported component
*/
prefix: '',
/**
* Directory that the component lives in.
* @default "./components/ui"
*/
componentDir: './components/ui'
}
})
4 Replies
here is my pacakge.json
please let me know if you need some other info
{
"name": "nuxt-app",
"private": true,
"type": "module",
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
},
"dependencies": {
"@vee-validate/zod": "^4.13.2",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"lucide-vue-next": "^0.408.0",
"radix-vue": "^1.9.1",
"tailwind-merge": "^2.4.0",
"tailwindcss-animate": "^1.0.7",
"vee-validate": "^4.13.2",
"vue": "latest",
"zod": "^3.23.8"
},
"devDependencies": {
"@nuxtjs/tailwindcss": "^6.12.1",
"nuxt": "^3.12.4",
"shadcn-nuxt": "^0.10.4",
"typescript": "^5.5.3"
}
}
{
"name": "nuxt-app",
"private": true,
"type": "module",
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
},
"dependencies": {
"@vee-validate/zod": "^4.13.2",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"lucide-vue-next": "^0.408.0",
"radix-vue": "^1.9.1",
"tailwind-merge": "^2.4.0",
"tailwindcss-animate": "^1.0.7",
"vee-validate": "^4.13.2",
"vue": "latest",
"zod": "^3.23.8"
},
"devDependencies": {
"@nuxtjs/tailwindcss": "^6.12.1",
"nuxt": "^3.12.4",
"shadcn-nuxt": "^0.10.4",
"typescript": "^5.5.3"
}
}
root@a01991fa031f:/usr/local/app# node -v
v22.5.1
root@a01991fa031f:/usr/local/app# node -v
v22.5.1
did you managed to find solution? for my case, in connecting to ws on eqmx, it keep disconnecting every 2to 3s
nope stilll looking for solution
Reverse proxying is really a pull-your-hair-and-bang-the-wall thing within docker 😦
We've currently got it working with this setup (reverse proxy is Apache -- we are stuck to that):
Maybe this will be of use for you.
As it's a long time ago we got this working, I don't remember all the details on how/why this works.
// (part of) nuxt.config.js
vite: {
server: {
hmr: {
path: 'ws',
}
},
},
// (part of) nuxt.config.js
vite: {
server: {
hmr: {
path: 'ws',
}
},
},
# (part of) httpd-vhosts.conf
<Location ~ ".*">
# .* is a wildcard for any location
ProxyPreserveHost On
ProxyPass http://tapp_nodejs.docker.dev:3000
ProxyPassReverse http://tapp_nodejs.docker.dev:3000
</Location>
<Location ~ "/_nuxt/ws">
ProxyPreserveHost On
# Proxy both ws and http by placing ws before http as described in this documentation:
# https://httpd.apache.org/docs/trunk/mod/mod_proxy_wstunnel.html
ProxyPass ws://tapp_nodejs.docker.dev:3000/_nuxt/ws
ProxyPass http://tapp_nodejs.docker.dev:3000/_nuxt/ws upgrade=websocket
ProxyPassReverse ws://tapp_nodejs.docker.dev:3000/_nuxt/ws
</Location>
<Location ~ "(/login|/auth/|/__webpack_hmr/).*">
AuthType openid-connect
Require valid-user
ProxyPreserveHost On
ProxyPass http://tapp_nodejs.docker.dev:3000
ProxyPassReverse http://tapp_nodejs.docker.dev:3000
</Location>
# (part of) httpd-vhosts.conf
<Location ~ ".*">
# .* is a wildcard for any location
ProxyPreserveHost On
ProxyPass http://tapp_nodejs.docker.dev:3000
ProxyPassReverse http://tapp_nodejs.docker.dev:3000
</Location>
<Location ~ "/_nuxt/ws">
ProxyPreserveHost On
# Proxy both ws and http by placing ws before http as described in this documentation:
# https://httpd.apache.org/docs/trunk/mod/mod_proxy_wstunnel.html
ProxyPass ws://tapp_nodejs.docker.dev:3000/_nuxt/ws
ProxyPass http://tapp_nodejs.docker.dev:3000/_nuxt/ws upgrade=websocket
ProxyPassReverse ws://tapp_nodejs.docker.dev:3000/_nuxt/ws
</Location>
<Location ~ "(/login|/auth/|/__webpack_hmr/).*">
AuthType openid-connect
Require valid-user
ProxyPreserveHost On
ProxyPass http://tapp_nodejs.docker.dev:3000
ProxyPassReverse http://tapp_nodejs.docker.dev:3000
</Location>
# (part of) docker-compose.yml
services:
nodejs:
hostname: tapp_nodejs.docker.dev
container_name: tapp_nodejs
build:
context: .
dockerfile: docker/nodejs.dockerfile
depends_on:
- 'mariadb'
environment:
ENVIRONMENT: '${ENVIRONMENT:-development}'
DOMAIN: '${DOMAIN:-https://tapp.docker.dev}'
PORT: '${PORT:-3000}'
DOCKER_RUNNING: 'true'
CYPRESS_INSTALL_BINARY: 0
# workaround for Prisma issue https://github.com/prisma/prisma/issues/12338
QUERY_BATCH_SIZE: 999
# DEBUG: "connect:dispatcher"
volumes:
- ./:/var/app
ports:
- '3004:3000'
# We will use port 3204 for Playwright ui
- '3204:3204'
# Default port for Vite HMR is 24678
- '24678:24678'
# Port 5555 can be used by `npx prisma studio` for debugging
- '5555:5555'
networks:
- default
tmpfs: /tmp
apache:
hostname: tapp_apache.docker.dev
container_name: tapp_apache
build:
context: .
dockerfile: docker/apache.dockerfile
volumes:
- ./docker/apache/extra:/usr/local/apache2/conf/extra
networks:
- default
# (part of) docker-compose.yml
services:
nodejs:
hostname: tapp_nodejs.docker.dev
container_name: tapp_nodejs
build:
context: .
dockerfile: docker/nodejs.dockerfile
depends_on:
- 'mariadb'
environment:
ENVIRONMENT: '${ENVIRONMENT:-development}'
DOMAIN: '${DOMAIN:-https://tapp.docker.dev}'
PORT: '${PORT:-3000}'
DOCKER_RUNNING: 'true'
CYPRESS_INSTALL_BINARY: 0
# workaround for Prisma issue https://github.com/prisma/prisma/issues/12338
QUERY_BATCH_SIZE: 999
# DEBUG: "connect:dispatcher"
volumes:
- ./:/var/app
ports:
- '3004:3000'
# We will use port 3204 for Playwright ui
- '3204:3204'
# Default port for Vite HMR is 24678
- '24678:24678'
# Port 5555 can be used by `npx prisma studio` for debugging
- '5555:5555'
networks:
- default
tmpfs: /tmp
apache:
hostname: tapp_apache.docker.dev
container_name: tapp_apache
build:
context: .
dockerfile: docker/apache.dockerfile
volumes:
- ./docker/apache/extra:/usr/local/apache2/conf/extra
networks:
- default