У меня есть docker -композиция с несколькими службами, одна из которых - приложение express, проксирующее другие службы, определенные в файле docker-compose.yml
. Идея состоит в том, что у меня есть служба на порту 3000, другая на 3001, и т. Д. c, и я хочу иметь возможность сделать myurl.com/service1
(что относится к myurl.com:3000).
Я пытаюсь прокси-сервер Rocket.chat, но, к сожалению, он не может правильно прокси. Я заметил, что не удается прокси-запрос к файлам JS и CSS.
Вот воспроизводимый пример:
docker-compose.yml
version: '2'
services:
mongo:
image: mongo:4.0
restart: unless-stopped
container_name: mongo
command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
mongo-init-replica:
image: mongo:4.0
command: >
bash -c
"for i in `seq 1 30`; do
mongo mongo/rocketchat --eval \"
rs.initiate({
_id: 'rs0',
members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
s=$$? && break || s=$$?;
echo \"Tried $$i times. Waiting 5 secs...\";
sleep 5;
done; (exit $$s)"
depends_on:
- mongo
## CHAT
rocketchat:
image: rocketchat/rocket.chat:latest
container_name: rocketchat
command: >
bash -c
"for i in `seq 1 30`; do
node main.js &&
s=$$? && break || s=$$?;
echo \"Tried $$i times. Waiting 5 secs...\";
sleep 5;
done; (exit $$s)"
restart: unless-stopped
environment:
- PORT=3000
- ROOT_URL=http://localhost:3000
- MONGO_URL=mongodb://mongo:27017/rocketchat
- MONGO_OPLOG_URL=mongodb://mongo:27017/local
- MAIL_URL=smtp://smtp.email
- ADMIN_USERNAME=pif
- ADMIN_PASS=paf
- ADMIN_EMAIL=pouf@plop.com
depends_on:
- mongo
ports:
- 3000:3000
# PROXY
proxy:
build: proxy
container_name: proxy
ports:
- 80:80
proxy/app.js
// Dependencies
const express = require('express');
const proxy = require('http-proxy-middleware');
const app = express();
app.use(
"/chat",
proxy.createProxyMiddleware({
target: "http://rocketchat:3000",
changeOrigin: true
})
);
app.listen(80, () => {
console.log('Proxy listening on port 80');
});
proxy/Dockerfile
FROM node:10
# Create app directory
WORKDIR /usr/src/app
COPY . .
RUN npm install
CMD [ "node", "app.js" ]
Запуск всего:
docker-compose up -d mongo
Ожидание I NETWORK [initandlisten] waiting for connections on port 27017
в
docker logs -f mongo
Затем
docker-compose up -d mongo-init-replica
docker-compose up -d rocketchat
Ожидание
➔ System ➔ startup
➔ +----------------------------------------------+
➔ | SERVER RUNNING |
➔ +----------------------------------------------+
➔ | |
➔ | Rocket.Chat Version: 3.0.3 |
➔ | NodeJS Version: 12.14.0 - x64 |
➔ | MongoDB Version: 4.0.16 |
➔ | MongoDB Engine: mmapv1 |
➔ | Platform: linux |
➔ | Process Port: 3000 |
➔ | Site URL: http://localhost:3000 |
➔ | ReplicaSet OpLog: Enabled |
➔ | Commit Hash: ef1e0b3613 |
➔ | Commit Branch: HEAD |
➔ | |
➔ +----------------------------------------------+
с docker logs -f rocketchat
docker-compose up proxy
Тогда если я go на http://localhost/chat имя вкладки правильно показывает Rocket.chat:
Но чат не запускается.
В консоли разработчика я вижу, что js и css не найдены:
Чего мне не хватает?
Насколько я понимаю, когда страница пытается достичь http://localhost/7ea1c8249f8789aeccf12f9cab36f8f78edf7940.css
, мое определение прокси пытается достичь http://rocketchat:3000/7ea1c8249f8789aeccf12f9cab36f8f78edf7940.css
, что неизвестно браузеру. Это то, что происходит? Если да, как мы можем заставить это работать? Мне нужно использовать target: "http://rocketchat:3000"
, потому что target: "http://localhost:3000"
не работает (он пытается достичь локального хоста прокси-контейнера).
Спасибо.