На этой неделе я хотел бы поделиться с вами чатом в реальном времени с открытым исходным кодом.проект。Также автор@moonrailgunНастоятельно рекомендуется для Гугу。
PS: В настоящее время автор работает в команде Feishu компании Byte в качестве фронтенд-инженера.
ministar
микроядерная архитектура)- Пользовательская тема
- Пользовательская панель
- Специальное действие
- Преобразование содержимого сообщения
- ...
moleculer
микросервисная архитектура)Tailchat спроектирован с использованием подключаемой архитектуры для удовлетворения различных потребностей разных людей.
ВоркованиеDemo:https://chat.gugu.ovh/
документ:https://tailchat.msgbyte.com/
GitHubИсходный код:https://github.com/msgbyte/tailchat
Блог автора:https://www.moonrailgun.com/about/
Собранный файл docker-compose.yaml кидаем прямо сюда. Друзья, знакомые со средой докера, могут его напрямую скопировать и собрать. (Переменные среды можно изменить по мере необходимости, обратившись к документации)
version: "3.3"
services:
# шлюз приложений
service-gateway:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: core/gateway
PORT: 3000
depends_on:
- mongo
- redis
labels:
- "traefik.enable=true"
- "traefik.http.routers.api-gw.rule=PathPrefix(`/`)"
- "traefik.http.services.api-gw.loadbalancer.server.port=3000"
networks:
- internal
# Обслуживание пользователей
service-user:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: core/user/*
depends_on:
- mongo
- redis
networks:
- internal
# Групповое обслуживание
service-group:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: core/group/*
depends_on:
- mongo
- redis
networks:
- internal
# чат-сервис
service-chat:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: core/chat/*
depends_on:
- mongo
- redis
networks:
- internal
# файловый сервис / Центр регистрации плагинов / Сервис конфигурации
service-file:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: core/file,core/plugin/registry,core/config
depends_on:
- mongo
- redis
- minio
networks:
- internal
service-openapi:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: openapi/app,openapi/oidc/oidc
OPENAPI_PORT: 3003
OPENAPI_UNDER_PROXY: "true"
depends_on:
- mongo
- redis
- minio
labels:
- "traefik.enable=true"
- "traefik.http.routers.openapi-oidc.rule=PathPrefix(`/open`)"
- "traefik.http.services.openapi-oidc.loadbalancer.server.port=3003"
networks:
- internal
# Служба плагинов (все плагины)
service-all-plugins:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICEDIR: plugins
depends_on:
- mongo
- redis
- minio
networks:
- internal
# база данных
mongo:
image: mongo:4
restart: on-failure
volumes:
- ./data:/data/db
networks:
- internal
# Кэширование данных и релейная связь
redis:
image: redis:alpine
restart: on-failure
networks:
- internal
# Служба хранения
minio:
image: minio/minio
restart: on-failure
networks:
- internal
environment:
MINIO_ROOT_USER: tailchat
MINIO_ROOT_PASSWORD: com.msgbyte.tailchat
volumes:
- ./storage:/data
command: minio server /data --console-address ":9001"
# Маршрутизация и переадресация
traefik:
image: traefik:v2.1
restart: unless-stopped
command:
- "--api.insecure=true" # Don't do that in production!
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entryPoints.web.address=:80"
- "--entryPoints.web.forwardedHeaders.insecure" # Not good
ports:
- 8080:80 # 8080 можно изменить на незанятый порт на вашем сервере.
- 127.0.0.1:11001:8080 #то же самое
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- internal
- default
networks:
internal:
name: tailchat-internal
Ниже приводится подробное руководство по сборке.
Требования к серверу: для этого проекта лучше всего использовать VPS с 1 ядром и 2G или более. Чем больше жесткий диск, тем лучше.
Билибили:https://www.bilibili.com/BV1aG411u7M8
Самая большая особенность легкого сервера Tencent Cloud заключается в том, что он «легкий». По сравнению с CVM, он больше подходит для начала работы новичкам. Здесь мы выбираем базовый образ Docker, который может сохранить этапы установки Docker позже (если вы захотите). настаивайте на использовании внутреннего сервера, установленный здесь образ Docker также поможет вам настроить внутренние источники изображений, что позволит ускорить доступ к ресурсам образа Docker).
Начальные настройки сервера, см.:
6 мелочей, которые вы «должны» сделать при покупке нового сервера
Защитите своих птенцов! Учебник по безопасности сервера на уровне няни!
Здесь, потому что мы используем Tencent Cloud Легкий сервер приложений,По умолчанию система создает нам имя.lighthouse
пользователей,В фоновом режиме системы также имеется брандмауэр (несколько часто используемых портов открыты по умолчанию)
Начинающим пользователям больше не придется беспокоиться о сложных конфигурациях безопасности сервера, что значительно снижает порог защиты сервера.
[Серия Docker] Новички могут играть на VPS-серверах без использования панели пагоды!
sudo -i # Переключиться на пользователя root
apt update -y # Пакеты обновления
apt install wget curl sudo vim git -y # Система Debian относительно чистая, в ней установлено часто используемое программное обеспечение.
Примечание. Если памяти VPS слишком мало, рекомендуется установить SWAP, обычно в 1–1,5 раза больше памяти, что может обеспечить более плавную работу системы!
Для настройки SWAP можно использовать скрипты:
wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh && chmod +x box.sh && clear && ./box.sh
<img src="https://img.laoda.de/i/2022/05/28/uoikkd-0.webp" alt="image-20220528185512488" style="zoom:50%;" />
выбирать18
,Затем введите значение, которое вы хотите расширить.
<img src="https://img.laoda.de/i/2022/05/28/up2dkf-0.webp" alt="image-20220528185604586" style="zoom:50%;" />
Используйте Tencent Cloud Легкий сервер приложений Друзья могут перейти непосредственно к5.2.4
wget -qO- get.docker.com | bash
docker -v #Проверить версию докера
systemctl enable docker # Установите автоматический запуск при загрузке
Измените конфигурацию Docker (необязательно) (изШаобин Блог)
Следующая конфигурация добавит пользовательскую интрасеть IPv6 Адрес для открытия контейнера IPv6 функцию, а также ограничение размера файла журнала для предотвращения Docker Логи заполняют винчестер (уроки из слез):
cat > /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
},
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:c0::/80",
"experimental":true,
"ip6tables":true
}
EOF
Затем перезапустите службу Docker:
systemctl restart docker
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version #Просмотреть версию docker-compose
curl -sSL https://get.daocloud.io/docker | sh
docker -v #Проверить версию докера
systemctl enable docker # Установите автоматический запуск при загрузке
Измените конфигурацию Docker (необязательно) (изШаобин Блог)
Следующая конфигурация добавит пользовательскую интрасеть IPv6 Адрес для открытия контейнера IPv6 функцию, а также ограничение размера файла журнала для предотвращения Docker Логи заполняют винчестер (уроки из слез):
cat > /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
},
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:c0::/80",
"experimental":true,
"ip6tables":true
}
EOF
Затем перезапустите службу Docker:
systemctl restart docker
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.1.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version #Просмотреть версию docker-compose
Обратитесь к содержанию здесь:https://blog.laoda.de/archives/nginxproxymanager
Создайте каталог установки:
sudo -i
mkdir -p /root/data/docker_data/tailchat
cd /root/data/docker_data/tailchat
Здесь мы устанавливаем напрямую с помощью докера.
vim docker-compose.yml
Под английским методом ввода,в соответствии сi
version: "3.3"
services:
# шлюз приложений
service-gateway:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: core/gateway
PORT: 3000
depends_on:
- mongo
- redis
labels:
- "traefik.enable=true"
- "traefik.http.routers.api-gw.rule=PathPrefix(`/`)"
- "traefik.http.services.api-gw.loadbalancer.server.port=3000"
networks:
- internal
# Обслуживание пользователей
service-user:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: core/user/*
depends_on:
- mongo
- redis
networks:
- internal
# Групповое обслуживание
service-group:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: core/group/*
depends_on:
- mongo
- redis
networks:
- internal
# чат-сервис
service-chat:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: core/chat/*
depends_on:
- mongo
- redis
networks:
- internal
# файловый сервис / Центр регистрации плагинов / Сервис конфигурации
service-file:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: core/file,core/plugin/registry,core/config
depends_on:
- mongo
- redis
- minio
networks:
- internal
service-openapi:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICES: openapi/app,openapi/oidc/oidc
OPENAPI_PORT: 3003
OPENAPI_UNDER_PROXY: "true"
depends_on:
- mongo
- redis
- minio
labels:
- "traefik.enable=true"
- "traefik.http.routers.openapi-oidc.rule=PathPrefix(`/open`)"
- "traefik.http.services.openapi-oidc.loadbalancer.server.port=3003"
networks:
- internal
# Служба плагинов (все плагины)
service-all-plugins:
build:
context: .
image: tailchat
restart: unless-stopped
env_file: docker-compose.env
environment:
SERVICEDIR: plugins
depends_on:
- mongo
- redis
- minio
networks:
- internal
# база данных
mongo:
image: mongo:4
restart: on-failure
volumes:
- ./data:/data/db
networks:
- internal
# Кэширование данных и релейная связь
redis:
image: redis:alpine
restart: on-failure
networks:
- internal
# Служба хранения
minio:
image: minio/minio
restart: on-failure
networks:
- internal
environment:
MINIO_ROOT_USER: tailchat
MINIO_ROOT_PASSWORD: com.msgbyte.tailchat
volumes:
- ./storage:/data
command: minio server /data --console-address ":9001"
# Маршрутизация и переадресация
traefik:
image: traefik:v2.1
restart: unless-stopped
command:
- "--api.insecure=true" # Don't do that in production!
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entryPoints.web.address=:80"
- "--entryPoints.web.forwardedHeaders.insecure" # Not good
ports:
- 8080:80 # 8080 можно изменить на незанятый порт на вашем сервере.
- 127.0.0.1:11001:8080 #11001 То же, что и выше.
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- internal
- default
networks:
internal:
name: tailchat-internal
в соответствии содин разesc
,Затем:wq
Сохраните и выйдите, затем
vim docker-compose.env
Напишите также следующий контент:
LOGGER=true
LOGLEVEL=info
SERVICEDIR=services
TRANSPORTER=redis://redis:6379
CACHER=redis://redis:6379
REDIS_URL=redis://redis:6379
MONGO_URL=mongodb://mongo/tailchat
SECRET=adswddWEQ@4 # Сменить ключ на свой
# file
API_URL=https://chat.gugu.ovh # Измените его на свой сайт
# minio
MINIO_URL=minio:9000
MINIO_USER=tailchat
MINIO_PASS=com.msgbyte.tailchat
# SMTP
SMTP_SENDER=
SMTP_URI=
# metrics
PROMETHEUS=1
в соответствии содин разesc
,Затем:wq
Сохраните и выйдите, затем
docker pull moonrailgun/tailchat
docker tag moonrailgun/tailchat tailchat # Измените тег, чтобы файл конфигурации мог его распознать.
наконец:
cd /root/data/docker_data/tailchat # Обязательно перейдите в папку, где находится файл dockercompose.
# Убедитесь, что файлы конфигурации (docker-compose.yml и docker-compose.env) находятся в текущем каталоге.
# Выполните следующую команду, чтобы начать одним щелчком мыши
docker-compose up -d
доступ: http://<server ip>:8080
Вы можете открыть чат
Обратите внимание, что для некоторых облачных сервисов может потребоваться ручное открытие портов брандмауэра.
существоватьdocker-compose.env
Некоторые переменные среды представлены в файле для конфигурации.。
tailchat
изdocker-compose.yml
Конфигурация по умолчанию обеспечивает следующую конфигурацию:
mongodb
: Постоянная база данныхredis
: База данных KV и служба ретрансляции сообщенийminio
: Распределенный файловый сервисоткрытый брандмауэризпорт8080
Способ открытия Tencent Cloud следующий:
<img src="https://img.laoda.de/i/2022/06/30/zlio5h-2.webp" alt="image-20220630215240864" style="zoom:33%;" />
<img src="https://img.laoda.de/i/2022/06/30/10h3dqt-2.webp" alt="image-20220630220546335" style="zoom:33%;" />
На картинке Заполните примеризда5230
,Заполните примечанияиздаmemos
,Здесь мы заполняем8080
,Заполните примерmicrobin
,ХОРОШО(если тысуществоватьdocker-composeИзменено в файле8081
,Вам нужно заполнить это здесь8081
,и так далее)
<img src="https://img.laoda.de/i/2022/08/19/o4byqz-2.webp" alt="image-20220819145844555" style="zoom:33%;" />
Проверятьпорт Оно занято?(к8080
Например),входить:
lsof -i:8080 #Проверить, занят ли порт 8080,если занято,Переопределить порт
Если ничего не появляется, это означает, что порт не занят и мы можем продолжить следующие операции ~
Если оно появляется:
-bash: lsof: command not found
бегать:
apt install lsof #Установить lsof
Если порт не занят (если занят, измените порт, например на 8081, обратите внимание на изменение в командной строке докера и фаерволе)
Теоретически мы можемквходитьhttp://ip:8080
посетил。
Уведомление: 1、понятия не имеюсерверIP,Можеткпрямойсуществоватькомандная строкавходить:
curl ip.sb
,отобразит текущийсерверизIP。 2. Если вы не можете получить доступ, проверьте еще раз, открыт ли соответствующий порт в брандмауэре панели Pagoda и внутреннем брандмауэре поставщика услуг.
Некоторые друзья могут захотеть создать его и поделиться им с другими.,Если вы хотите позже поделиться им с другими,IP+порт — это слишком неэлегантно,Гугу предлагает каждому получить доменное имя,легко запомнить,Это также выглядит немного более официально. Это может сделать https,Это сделает веб-страницу более безопасной. (требуется доступ к IP+порту,Можеткпрямой跳到5.6
,и пропустить6. Обратный прокси
часть)
иnamesiloвышеxyzсуффиксиздоменное имя Всего один год7кусокденьги,Можно выбрасывать каждый год.
Если вы хотите использовать его в течение длительного времени,По-прежнему рекомендуется покупать доменное имя с суффиксом com.,более формальный,Можетквходитьlaodade
получить1Долларизскидка(понятия не имею现существовать Есть ли еще)
namesiloПоставляется с защитой конфиденциальности,Гугу использовал этот,Цена также относительно низкая среди этих регистраторов.,Ключевым моментом является то, что его компания не похожа на других регистраторов доменных имен.,№ 7788изрутина!(Это просто какой-то фоновый интерфейсуродливыйдревний = =)
Давайте посмотрим вниз!
cd /root/data/docker_data/tailchat
docker-compose down
cp -r /root/data/docker_data/tailchat /root/data/docker_data/tailchat.archive # Предварительно сделайте резервную копию, на всякий случай. На самом деле здесь она не нужна, потому что мы не сопоставляем ее с локальной папкой.
docker-compose pull
docker-compose up -d # Пожалуйста, не используйте docker-compose stop, чтобы остановить контейнер, поскольку для этого требуется дополнительное время для ожидания остановки контейнера; up Когда -d напрямую обновляет контейнер, он автоматически останавливается и немедленно пересобирает новый контейнер. Нет необходимости тратить это время.
docker image prune # prune Команда используется для удаления тех, которые больше не используются. docker объект. Удалить все элементы, которые не были tag Теги и изображения, не используемые контейнерами
намекать:
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]
входитьy
Приложения, созданные с использованием Docker, очень легко обновлять~
cd /root/data/docker_data/tailchat
docker-compose down
rm -rf /root/data/docker_data/tailchat # Полностью удалить данные, сопоставленные с локальными
Может быть удален очень чисто.
Добавление поворота прокси До,Убедитесь, что вы завершили анализ доменного имени.,Не будетиз Можеткпосмотри на это:Доменное имя и разрешить его на сервере(Покупка доменного имени, разрешение доменного имени Видеоурок)
После этого войдите в Nginx. Proxy Manager(Не будетизпосмотри на это:Установите прокси-менеджер Nginx.(Связанные руководства))
Уведомление: Nginx Proxy Manager(к В дальнейшем именуемыйNPM)будет использоваться
80
、443
порт,Поэтому эту машину невозможно занять (например, там изначально стоит Nginx)
Просто добавьте несколько фотографий:
<img src="https://img.laoda.de/i/2022/05/02/kfes4s\_7.webp" alt="image-20220502123517401" style="zoom: 33%;" />
Обратите внимание на заполнение соответствующегоиз
доменное имя
、IP
ипорт
,Согласно статье,должно быть8080
Заполните IP:
Если Nginx Proxy Manager и Tailchat находятся на одном сервере, вы можете ввести:
ip addr show docker0
Просмотрите соответствующий внутренний IP-адрес контейнера Docker.
В противном случае заполните напрямуюtailchat
МестосуществоватьизсерверIPПросто отлично。
<img src="https://img.laoda.de/i/2022/04/03/h9azjx\_7.webp" alt="image-20220403104353185" style="zoom: 33%;" />
Откройте его еще раз и проверьте следующее:
Затем вы можете использовать доменное имя для установки и доступа к нему.
Я обнаружил, что многие друзья до сих пор привыкли использовать панель Pagoda, и вот обратная конфигурация панели Pagoda:
Просто создайте новый сайт, без базы данных, без PHP, просто статический.
Затем откройте следующую конфигурацию и измените конфигурацию Nginx.
Код выглядит следующим образом:
location / {
proxy_pass http://127.0.0.1:8080/; # Будьте осторожны и измените его на тот порт, который вы действительно используете.
rewrite ^/(.*)$ /$1 break;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade-Insecure-Requests 1;
proxy_set_header X-Forwarded-Proto https;
}
Этот метод работает для 90% обратных прокси.
Некоторые студенты могут спросить, почему бы просто не использовать обратную прокси-функцию, идущую в комплекте с пагодой.
Это также возможно, но сам Гугу уже сталкивался с ситуацией, когда при наличии нескольких веб-сайтов, которые необходимо отменить, при настройке здесь будет сообщаться об ошибке = =
Так что позже он мне не понадобился, и я просто использовал описанный выше метод для его работы.
Посмотрите видео Гугу.
Вы можете использовать его больше и давать больше комментариев и предложений автору, чтобы помочь проекту быстрее обновляться и обновляться!
Желаю вам всем получить удовольствие от его использования,有问题МожеткидтиGitHubнестиIssues,Вы также можете общаться и обсуждать друг с другом в комментариях.
в то же время,проект находится на начальной стадии,Студенты, которые имеют возможность внести свой вклад в проект,Вы также можете активно присоединитьсяпроектЧжунлай,Внесите свой вклад!
ВоркованиеDemo:https://chat.gugu.ovh/
документ:https://tailchat.msgbyte.com/
GitHubИсходный код:https://github.com/msgbyte/tailchat