Exceptionless 5.0.0 本地Docker快速部署介绍

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云数据库 Tair(兼容Redis),内存型 2GB
简介: 文章来源于阿里云 MVP周旭龙。

在之前我有专门写两篇文章介绍过Exceptionless这款开源日志项目的使用和部署,但是当时是基于4.1.0版本(2017年的release),时隔两年多Exceptionless也推出了5.0.0版本。


一、关于Exceptionless 5.0.0


  Exceptionless 是一个开源的实时的好用的日志收集框架,它将日志收集变得简单易用并且不需要了解太多的相关技术细节及配置。但是之前的版本将其Web和API绑定在了Windows平台通过IIS运行,对于已经步入云原生时代的我们显得有点格格不入。5.0.0的发布解决了这一痛点,其最大的变化就是基于ASP.NET Core重写并支持跨平台,也就是说当初我们设想的要是能够基于Docker部署在Linux服务器下就更好了的愿望已经实现了,在此真心感谢Exceptionless项目的各位贡献者。本文就Exceptionless 5.0.0版本介绍一下快速地部署开发环境和生产环境,相信对有兴趣的朋友会有一点帮助。


  至此我也可以将我们之前的Exceptionless从Windows Server迁移到Linux上了!


二、快速本地部署步骤


2.1 安装Docker 18.09+


  由于Exceptionless 5.0.0的一个前置要求是Docker版本(CE)在18.09及以上,因此我们需要安装一个18.09+的Docker CE版本到Linux服务器上,如果你之前安装了可以跳过此步骤,但如果版本小于18.09,那么请清理掉老版本升级到新版本,升级版本可以参考以下步骤。


  实验环境:阿里云ECS主机,CentOS 7.4


  (1)清理已有Docker老版本


  停止Docker老版本:



systemctl stop docker


  卸载软件包:


复制代码

yum erase docker \
docker</span>-<span style="color: #000000;">client \
docker</span>-client-<span style="color: #000000;">latest \
docker</span>-<span style="color: #000000;">common \
docker</span>-<span style="color: #000000;">latest \
docker</span>-latest-<span style="color: #000000;">logrotate \
docker</span>-<span style="color: #000000;">logrotate \
docker</span>-<span style="color: #000000;">selinux \
docker</span>-engine-<span style="color: #000000;">selinux \
docker</span>-<span style="color: #000000;">engine \
docker</span>-ce</pre>

复制代码

  删除相关配置文件:



find /etc/systemd -name 'docker' -exec rm -f {} ;
find /etc/systemd -name 'docker' -exec rm -f {} ;
find /lib/systemd -name 'docker' -exec rm -f {} ;
rm -rf /var/lib/docker #删除以前已有的镜像和容器,非必要,慎删
rm -rf /var/run/docker


  (2)安装Docker 18.09+


  软件包安装:



yum install -y yum-utils  device-mapper-persistent-data lvm2


  添加yum源:



yum-config-manager \
--add-repo \
https:</span><span style="color: #008000;">//</span><span style="color: #008000;">download.docker.com/linux/centos/docker-ce.repo</span></pre>


  查看可安装的版本:目前最新版本已经是19.03



yum list docker-ce --showduplicates | sort -r


  安装指定版本:18.09



yum install docker-ce docker-ce-18.09.9-3.el7 -y


  启动Docker并设置开机自启动:



systemctl start docker
systemctl enable docker


  查看Docker版本:



docker version 


  你可以看到已经是18.09版本了:


  


2.2 下载Exceptionless 5.0.0 Release包


  传送门:Exceptionless release


  


2.3 安装Exceptionless 5.0.0


  (1)修改docker-compose.yml文件,设置外部访问地址/域名(适配你的服务器IP地址 或 域名+SSL证书,这里我直接修改为我的阿里云服务器的外网IP地址,参考我的注释)


复制代码

version: '3.4'

services:
api:

depends_on:
  </span>-<span style="color: #000000;"> elasticsearch
  </span>-<span style="color: #000000;"> redis
build:
  context: .
  target: api
image: exceptionless</span>/<span style="color: #000000;">api:latest
restart: on</span>-<span style="color: #000000;">failure
environment:
  EX_AppMode: Production
  EX_BaseURL: http:</span><span style="color: #008000;">//</span><span style="color: #008000;">192.168.16.170:5100 #UI地址,修改这里的IP地址为你的服务器IP地址</span>
  EX_ConnectionStrings__Cache: provider=<span style="color: #000000;">redis
  EX_ConnectionStrings__Elasticsearch: server</span>=http:<span style="color: #008000;">//</span><span style="color: #008000;">elasticsearch:9200</span>
  #EX_ConnectionStrings__Email: smtps:<span style="color: #008000;">//</span><span style="color: #008000;">user:password@smtp.host.com:587</span>
  EX_ConnectionStrings__MessageBus: provider=<span style="color: #000000;">redis
  #EX_ConnectionStrings__Metrics: provider</span>=statsd;server=<span style="color: #000000;">statsd;
  EX_ConnectionStrings__Queue: provider</span>=<span style="color: #000000;">redis
  EX_ConnectionStrings__Redis: server</span>=redis,abortConnect=<span style="color: #0000ff;">false</span><span style="color: #000000;">
  EX_ConnectionStrings__Storage: provider</span>=folder;path=/app/<span style="color: #000000;">storage
  EX_RunJobsInProcess: </span><span style="color: #800000;">'</span><span style="color: #800000;">false</span><span style="color: #800000;">'</span><span style="color: #000000;">
ports:
  </span>- <span style="color: #800080;">5000</span>:<span style="color: #800080;">80</span> # This can be commented out <span style="color: #0000ff;">if</span><span style="color: #000000;"> using reverse proxy.
volumes:
  </span>- appdata:/app/<span style="color: #000000;">storage

jobs:

depends_on:
  </span>-<span style="color: #000000;"> api
build:
  context: .
  target: job
image: exceptionless</span>/<span style="color: #000000;">job:latest
restart: on</span>-<span style="color: #000000;">failure
environment:
  EX_AppMode: Production
  EX_BaseURL: http:</span><span style="color: #008000;">//</span><span style="color: #008000;">192.168.16.170:5100 #UI地址,修改这里的IP地址为你的服务器IP地址</span>
  EX_ConnectionStrings__Cache: provider=<span style="color: #000000;">redis
  EX_ConnectionStrings__Elasticsearch: server</span>=http:<span style="color: #008000;">//</span><span style="color: #008000;">elasticsearch:9200</span>
  #EX_ConnectionStrings__Email: smtps:<span style="color: #008000;">//</span><span style="color: #008000;">user:password@smtp.host.com:587</span>
  EX_ConnectionStrings__MessageBus: provider=<span style="color: #000000;">redis
  #EX_ConnectionStrings__Metrics: provider</span>=statsd;server=<span style="color: #000000;">statsd;
  EX_ConnectionStrings__Queue: provider</span>=<span style="color: #000000;">redis
  EX_ConnectionStrings__Redis: server</span>=redis,abortConnect=<span style="color: #0000ff;">false</span><span style="color: #000000;">
  EX_ConnectionStrings__Storage: provider</span>=folder;path=/app/<span style="color: #000000;">storage
volumes:
  </span>- appdata:/app/<span style="color: #000000;">storage

ui:

image: exceptionless</span>/<span style="color: #000000;">ui:latest
environment:
  AppMode: Production
  EX_ApiUrl: http:</span><span style="color: #008000;">//</span><span style="color: #008000;">192.168.16.170:5000 #API地址,修改这里的IP地址为你的服务器IP地址</span>
  #EX_Html5Mode: <span style="color: #800000;">'</span><span style="color: #800000;">false</span><span style="color: #800000;">'</span><span style="color: #000000;">
  #EX_EnableSsl: </span><span style="color: #800000;">'</span><span style="color: #800000;">false</span><span style="color: #800000;">'</span><span style="color: #000000;">
  #EX_EnableAccountCreation: </span><span style="color: #800000;">'</span><span style="color: #800000;">false</span><span style="color: #800000;">'</span><span style="color: #000000;">
ports:
  </span>- <span style="color: #800080;">5100</span>:<span style="color: #800080;">80</span> # This can be commented out <span style="color: #0000ff;">if</span><span style="color: #000000;"> using reverse proxy.

reverseproxy:

depends_on:

- api

- ui

image: valian

/docker-nginx-auto- ssl

restart: on

- failure

ports:

- 80: 80

- 443: 443

volumes:

- ssldata:/etc/resty-auto- ssl

environment:

ALLOWED_DOMAINS:

' (ex-ui|ex-api).mydomainn.com '

SITES:

' ex-ui.mydomainn.com=ui;ex-api.mydomainn.com=api '

elasticsearch:

image: exceptionless</span>/elasticsearch:<span style="color: #800080;">1</span><span style="color: #000000;">
restart: on</span>-<span style="color: #000000;">failure
environment:
  cluster.name: </span><span style="color: #800000;">'</span><span style="color: #800000;">exceptionless</span><span style="color: #800000;">'</span><span style="color: #000000;">
  bootstrap.memory_lock: </span><span style="color: #800000;">'</span><span style="color: #800000;">true</span><span style="color: #800000;">'</span><span style="color: #000000;">
  discovery.type: single</span>-<span style="color: #000000;">node
  ES_JAVA_OPTS: </span><span style="color: #800000;">'</span><span style="color: #800000;">-Xms512m -Xmx512m</span><span style="color: #800000;">'</span><span style="color: #000000;">
  xpack.security.enabled: </span><span style="color: #800000;">'</span><span style="color: #800000;">false</span><span style="color: #800000;">'</span><span style="color: #000000;">
  xpack.graph.enabled: </span><span style="color: #800000;">'</span><span style="color: #800000;">false</span><span style="color: #800000;">'</span><span style="color: #000000;">
  xpack.watcher.enabled: </span><span style="color: #800000;">'</span><span style="color: #800000;">false</span><span style="color: #800000;">'</span><span style="color: #000000;">
ports:
  </span>- <span style="color: #800080;">9200</span>:<span style="color: #800080;">9200</span>
  - <span style="color: #800080;">9300</span>:<span style="color: #800080;">9300</span><span style="color: #000000;">
ulimits:
  memlock:
    soft: </span>-<span style="color: #800080;">1</span><span style="color: #000000;">
    hard: </span>-<span style="color: #800080;">1</span><span style="color: #000000;">
volumes:
  </span>- esdata:/usr/share/elasticsearch/<span style="color: #000000;">data

kibana:

depends_on:
  </span>-<span style="color: #000000;"> elasticsearch
image: exceptionless</span>/kibana:<span style="color: #800080;">1</span><span style="color: #000000;">
restart: on</span>-<span style="color: #000000;">failure
environment:
  xpack.security.enabled: </span><span style="color: #800000;">'</span><span style="color: #800000;">false</span><span style="color: #800000;">'</span><span style="color: #000000;">
ports:
  </span>- <span style="color: #800080;">5601</span>:<span style="color: #800080;">5601</span><span style="color: #000000;">

redis:

image: redis:alpine
restart: on</span>-<span style="color: #000000;">failure
ports:
  </span>- <span style="color: #800080;">6379</span>:<span style="color: #800080;">6379</span><span style="color: #000000;">

volumes:
esdata:

driver: local

appdata:

driver: local

ssldata:

driver: local</span></pre>

复制代码


Note:在这个docker-compose.yml中定义了Exceptionless的最小化运行环境,但官方建议生产环境使用ElasticSearch集群,并适当修改ElasticSearch的内存限制。如果你的量很小真的不大,那么这个最小化的运行环境也够用了,没必要为了高可用而高可用。  



  此外,貌似官方已经将exceptionless/elasticsearch:1这个镜像移除了,大家可以使用这个镜像:edisonsaonian/exceptionless-elasticsearch:1


  (2)将Release包上传到阿里云服务器,然后通过SSH执行一下shell命令(首先cd到这个release包的目录下)启动Exceptionless 5.0.0。



docker-compose up -d


  整个过程会比较漫长,因为会经过34个Steps,拉取很多镜像,类似于Redis,ElasticSearch,Kibana及.NET Core SDK等等,请耐心等待。最终效果如下所示:


  


  


2.4 使用Exceptionless 5.0.0


  (1)访问你的服务器IP:5100 即可访问Exceptionless Web管理登录界面,如果你能看到,那么代表部署成功了。注册一个账号,然后登陆吧。


  


  (2)可以看到主页是全新的中文管理界面,感谢贡献者的努力


  


  


  (3)创建一些示例项目,如“XDP.Product.API”,并获取API Key


  


  (4)在你的ASP.NET Core WebAPI项目中配置API Key,并向Exceptionless API(这里是5000端口)发送Log


  (5)在Exceptionless中查看Log


  


  


三、遗留问题:Email通知配置


  使用过Exceptionless的童鞋都知道,Exceptionless提供了强大的Email通知机制,可以为用户提供及时的严重错误通知和每日报告。


  


  在上面介绍的安装基础上,根据官方Wiki文档,按理说我们只需要确保docker-compose.yml中的api和jobs的AppMode为Production模式并设置SMTP就可以开启Email通知。





EX_AppMode: Production
EX_ConnectionStrings__Email: smtps:
//edisonchou7%40qq.com:zltqvl2321ed@smtp.qq.com:465


这里的%40是@的转义替代,在Exceptionless中会使用Decode进行解码为@,原因好像是因为它是通过@符号分割前方的用户名+密码和后方的Host+Port,也是醉了。

  设置完成后,通过以下命令重启docker:




docker-compose up -d

  docker-compose会自动帮我们重启更改过的容器,比如api和jobs。

  但是,我试了很多次都发现还是无法正常发送Email通知,由于不影响使用,也就暂时没去深究了,有解决的朋友可以告知并 分享一下解决办法,谢谢。

四、小结


  本文介绍了Exceptionless 5.0.0的容器化本地部署,主要参考自Exceptionless的Self-Host文档。


参考资料


1、Exceptionless release


2、Exceptionless Self-Hosting Documention



文章转载自阿里云 MVP周旭龙,查看原文

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
27天前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
118 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
1月前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
368 11
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
10天前
|
Java 应用服务中间件 Docker
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
18 2
|
16天前
|
Java Linux Docker
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
32 3
|
1月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
111 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
23天前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
28天前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
28天前
|
Docker 微服务 容器
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
55 1
|
2月前
|
Web App开发 前端开发 测试技术
【Docker项目实战】使用docker部署tabler后台模版
【10月更文挑战第10天】使用docker部署tabler后台模版
45 1
【Docker项目实战】使用docker部署tabler后台模版
|
2月前
|
JSON JavaScript 测试技术
【Docker项目实战】使用Docker部署PPTist在线演示文稿应用
【10月更文挑战第9天】使用Docker部署PPTist在线演示文稿应用
48 1
【Docker项目实战】使用Docker部署PPTist在线演示文稿应用