Прокси-чат Rocket с http-proxy-middleware в docker -композитной установке - PullRequest
0 голосов
/ 14 марта 2020

У меня есть 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" ]

Запуск всего:

  • Запуск понедельника go:
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:

enter image description here

Но чат не запускается.

В консоли разработчика я вижу, что js и css не найдены:

enter image description here

enter image description here

Чего мне не хватает?

Насколько я понимаю, когда страница пытается достичь http://localhost/7ea1c8249f8789aeccf12f9cab36f8f78edf7940.css, мое определение прокси пытается достичь http://rocketchat:3000/7ea1c8249f8789aeccf12f9cab36f8f78edf7940.css, что неизвестно браузеру. Это то, что происходит? Если да, как мы можем заставить это работать? Мне нужно использовать target: "http://rocketchat:3000", потому что target: "http://localhost:3000" не работает (он пытается достичь локального хоста прокси-контейнера).

Спасибо.

...