技术

技术

前端跨项目组件化及基于Docker的快速部署方案

> 2018年04月14日凌晨 天气🌧 最近静下心来写了几个项目,花了些时间重新整理了整套组件化方案和部署方案,记录一下。 跨项目组件化 前端的组件化不用多说了,发展到现在,无论是React的还是Vue,都提供了相当方便的组件化实现。在日常项目中,有些组件其实是可以跨多个项目使用的,将这些组件抽离出来作为单独项目,并复用到其他项目中去,一来可以避免重复造轮子,加快开发速度,二来维护效率也高,一些bugfix或者新特性直接在组件中更新,项目中只需要更新引用版本号即可,方便快捷。 跨项目的组件化方式也很多,开发阶段可以用npm link,相当于在主项目的node_modules 目录中创建了一个链向组件项目的软链,方便是挺方便,但是有几个问题。一是Eslint的目录递归检查是基于最终实际目录的,也就是说虽然Eslint默认排除 node_modules 目录,但它依然会对该目录中的软链项目进行检查,一旦组件项目的Eslint规则和主项目的Eslint不一致的话,主项目Eslint就没法通过,这个比较蛋疼,就得临时禁用Eslint或者修改组件项目的规则。作为组件项目应该保证少依赖,

技术

Maven项目Docker一键发布配置

> 2018年04月12日 小雨🌦 Docker用了很久了,之前Maven项目一直用的docker-maven-plugin [https://github.com/spotify/docker-maven-plugin] ,但是作者目前已经不推荐使用这种方式了,该项目已经不再更新功能,只提供bugfix。他们的新项目叫做dockerfile-maven [https://github.com/spotify/dockerfile-maven] ,配置上有些不同,之前一直没时间去更新,最近的一个项目中,采用了最新的插件,中间也踩过不少坑,刚刚终于都搞定了,记录一下。 Dockerfile无需多说,整理了一个通用的,可以用在任意Spring Boot项目中,如下: FROM frolvlad/alpine-oraclejdk8:slim RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime VOLUME /tmp ARG JAR_FILE

技术

微信小程序在安卓上SSL报错的问题

开发工具上和iOS真机上访问api都是正常的,在安卓上提示如下错误: > request:fail ssl hand shake error 尝试在安卓的浏览器中访问api地址,提示“该证书并非来自可信的授权中心”,于是感觉应该是SSL证书的问题。 SSL证书是通过Let's Encrypt申请的,部署在阿里云SLB上。 通过https://www.ssllabs.com/ssltest/index.html 测试,TLS1.0、TLS1.1、TLS1.2都是支持的,但有如下提示 > This server's certificate chain is incomplete. Grade capped to B. 于是重新查看了下Let's Encrypt生成的证书文件,

Ghost博客迁移至阿里云Docker

技术

Ghost博客迁移至阿里云Docker

刚刚,将Ghost博客迁移到了阿里云Docker上。 由于近期网络问题,导致家里的NAS已经无法提供443端口的服务了,之前的临时解决方案是将hadb.me的域名解析到DigitalOcean的一台机器上,然后用nginx转发到NAS的20443端口,通过海外的服务器做了中转,访问速度可想而知。并且近期海外网络极不稳定,最终决定还是老老实实备案,迁移到阿里云上来。 近年来,Docker容器化越来越火,我最近的几个项目也都是通过Docker来部署的,非常方便。 域名备案经历了几波周折,提交备案后,阿里云初检未通过,有如下问题: 1. 根据要求已经取得备案号的网站最下方必须显示您的备案号,并能链接到工信部网站www.miitbeian.gov.cn [http://www.miitbeian.gov.cn/],目前您网站“monkeyrun.net”最下方备案号无法链接工信部网站,请您修改 2. 根据要求网站名称必须与主办单位名称有一定的关联性。您备案的网站名称“HADB的博客”与主办单位名称“上海猿奋网络科技有限公司”没有关联性,请修改 3. 根据要求域名持有者必须

开始使用Ghost啦!

日志

开始使用Ghost啦!

关注Ghost很久很久了,14年就尝试过0.5.3版,由于一直没有出正式版,所以一直处于关注和等待中。 终于在差不多一年前Ghost在GitHub上发布了1.0.0-alpha.1 [https://github.com/TryGhost/Ghost/releases/tag/1.0.0-alpha.1] ,本以为很快就能出正式版了,开始了焦急的等待。一开始基本上每天都会去GitHub上检查下他们的动态。后来变成了大约每周会去看一次,等了一个又一个版本,甚至等了大半年,终于在第21个alpha版后,推出了beta版,随后不久发布了1.0.0正式版。尝试去安装,结果发现挺多坑的,试了很久都没成功,正式版的Docker镜像也一直没出。再后面,Ghost团队的更新也非常勤奋,基本每周都会发布新版本,那段期间我正好也比较忙,一直在默默关注,没有再去尝试安装,任务列表里的“博客迁移到Ghost上”也被一再推迟。 直到今天,突然想再去试下。看到Docker镜像也同步了最新的版本,于是直接上Docker。几分钟就装完了,

技术

Entity Framework Core SQLite provider向已存在的表中添加外键

SQLite本身不支持向已创建的表中添加外键,类似的限制还有很多,比较蛋疼,具体可以参见SQLite Limitations [https://docs.microsoft.com/en-us/ef/core/providers/sqlite/limitations]。 项目中,如果是测试的时候,数据不是很重要的话,最方便的方法就是把已经创建的Migrations包括ModelSnapshot都删掉,重新Add-Migration重建数据库。 对于已经发布的应用,数据库不能删了创建的话,可以“曲线救国”。 假设需要给TableA添加一个需要建立外键的字段ColumnA,为了增加难度,假设TableB中的Column B是TableA的外键。具体操作方法如下: 1. 先在代码中TableA里添加ColumnA(不设置外键),Add-Migration,更新到线上数据库 2. 将本地的数据库改名为database-backup,删除项目中所有Migrations和ModelSnapshot,创建一个RebuildDatabase的Migration,创建全新的数据库,从新数据

技术

自建NAS及DDNS

众所周知的原因,前段时间360云盘也倒下了,之前大部分照片、电影资源都放在360云盘上。由于国内的环境,感觉第三方云盘的可靠程度还不如自己建个NAS。前端时间研究了硬件方案,今天研究了下外网访问的方案。 固定IP肯定是拉不起,太贵了,国内运营商太黑心。只能通过DDNS,但花生壳这种我也不想用,以前试用过,速度太慢。既然是程序猿,还是自己来吧。具体方案如下: 1. 阿里云的云解析DNS,升级付费版,将最低TTL值拉到1秒,其余都拉成最低配置,一年40.8块钱,完全可以接受。 2. 在自己的阿里云服务器上搭建一个小站点,用于返回来访请求的公网IP地址。没有外网服务器的,可以利用ip138的服务来做, http://city.ip138.com/ip2city.asp。 3. 做一个小应用,跑在NAS上,每秒向步骤2中的站点请求获取NAS的外网IP,并通过阿里云云解析DNS的api接口,更新域名的IP地址,并记录,如果下次请求IP不变则跳过,IP变化了则更新。做好日志,运行一段时间之后看下电信的动态ip更换有没有规律,可以适当调整获取外网IP的频率。

技术

解决阿里云CDN回源https返回503错误的问题

最近打算把www.monkeyrun.net [https://www.monkeyrun.net]改成全站https,使用的Let’s Encrypt [https://letsencrypt.org/] 的证书。然而在设置阿里云CDN的时候,阿里云CDN回源一直返回503错误,发工单,来来回回经过整整两天,终于把问题解决。容我娓娓道来。 最一开始,我先开启了阿里云的CDN,源站设置为www.monkeyrun.net [https://www.monkeyrun.net] ,通过80端口回源,没有任何问题。 后来当时配置好证书,站点也开启了https之后,将回源端口改为443,开始出问题了,CDN资源全部返回503。而直接通过浏览器访问https的源站内容,都是没有问题的。 发工单,经过漫长的等待和提供链接等更详细的信息之后,阿里云的工作人员首先认为这个问题可能是由于我开启了防火墙或者一些安全软件导致,拦截或阻止了CDN节点的回源请求。我关闭了防火墙,问题依旧存在。 又经过漫长的等待以及转交专项处理人员处理之后,给我发了个抓的包,说是CDN回源请求被源站给RST了,让我检查

技术

更新“Microsoft.NETCore.App”到1.0.1出现502.5错误的问题

今天白天遇到一个问题,花了很长时间才解决。记录下。 问题是这样的,我是个强迫症,如果发现有可以更新的包,我肯定会去更新。 新建了一个ASP.NET Core的Api项目,发现有包可以更新,于是通过Nuget自动更新。更新完之后,出现第一个坑。 原先的 "Microsoft.NETCore.App": { "version": "1.0.0", "type": "platform" } 更新之后会丢失"type": "platform",变成 "Microsoft.NETCore.App": "1.0.

技术

Windoows下Redis Sentinel的部署

虽然很久之前就了解了Redis的哨兵机制,今天第一次尝试在多个服务器上部署多个Redis实例,并且设置了哨兵用来进行自动的主从切换。 一、部署Redis 在3台服务器上分别安装了Redis,Redis on Windows下载地址: https://github.com/MSOpenTech/redis/releases。 配置文件添加密码: requirepass <密码> masterauth <密码> 除了设置本实例的密码外,还需要输入master的密码(需要和本实例密码相同),所有实例需要设置相同的密码,以便进行主从切换。 需要注意的是,Redis从某个版本起,加入了一个protected-mode的保护模式。启动保护模式的条件是protected-mode开启,且没有设置bind ,且没有设置密码。我的Redis的实例部署在多个公网服务器下,所以加密码是必须的,另外需要注释掉默认的bind 127.0.0.1 ,以使用公网IP。因为设置了密码,所以protected-mode就无需进行改动,直接使用默认的就可以了。但是在后面哨兵的配置中的保护模式会有一个坑。 在

技术

使用Visual Studio Web Deploy发布ASP.NET Core至IIS

操作系统要求 * Windows 7及以上 * Windows Server 2008 R2及以上 IIS配置 在服务器管理器中,通过添加角色和功能的向导,在服务器角色中勾选Web服务器(IIS),并安装。 安装.NET Core Windows Server Hosting包 1. 安装.NET Core Windows Server Hosting [https://go.microsoft.com/fwlink/?LinkID=827547],这个包会安装.NET Core运行时、.NET Core库和ASP.NET Core模块,这个模块会在IIS和Kestrel服务器之间创建反向代理。 2. 重启服务器,或者从命令行执行net stop was /y,接着执行net start w3svc。

技术

“Bad Request - Invalid Hostname”的解决办法

最近在做一个微信端的应用,除了在本地测试之外,有时候还需要在手机上进行测试。 假设我的手机和PC在同一内网内,PC的IP是192.168.1.2,Website的端口是12345。 我的第一反应是,我应该在手机上通过http://192.168.1.2:12345来访问我的站点。 然而,我得到了这样一个错误: Bad Request - Invalid Hostname ------------------------------------------------ HTTP Error 400. The request hostname is invalid. 方法很简单,Visual Studio 2015的项目目录中会有一个.vs的文件夹,打开.vs\config\applicationhost.config ,找到目标站点的配置节点,例如: <site name="Demo.Website&

技术

ASP.NET Core初体验

前两天试了下ASP.NET Core MVC,很好用。微软整合了大量前端工具,npm、Bower都可以很方便地使用了,甚至对Grunt、Gulp这类的工具都有集成一些任务管理器,这对前端来说,是一件鼓舞人心的事。 ASP.NET Core MVC的推荐目录结构也进行了调整,新增了wwwroot 这样一个静态目录,js、css、图片都可以放这里面,而Bower管理的第三方前端库则会自动下载到wwwroot里面的lib目录下。作为强迫症的我,wwwroot 这个目录必须全部是自动生成的。通过Gulp,可以很轻松的实现这一点。继承原先的目录结构习惯,在解决方案下建立Scripts、Styles、Images文件夹,里面用来放原始的js、less和图片,然后通过Gulp进行合并、压缩、复制到 wwwroot目录下,这样wwwroot这个目录就可以在git里面排除掉了。完美。而在ASP.NET Core的项目目录下默认的.gitignore 文件里,微软其实是已经有这样的想法: # Uncomment if you have tasks

技术

微信公众号中更换域名

更新 如果需要实现微信授权支持多个回调域名,可以参考我这个开源项目:GetWeixinCode [https://github.com/HADB/GetWeixinCode] -------------------------------------------------------------------------------- 问题描述 项目刚做的时候,并没有找到好的域名,所以用了一个比较长的域名。后来公司花钱买了一个心仪的域名,理所当然,我们需要启用新域名了。 我们的H5站点是基于微信的,由于微信的各种坑,这里有很多值得注意的地方。 首先,需要在公众号设置中,将新域名加入到业务域名以及JS接口安全域名中,在微信支付的开发配置中,也要将新域名加入支付授权目录中。这几个比较容易,因为他们都支持配置多个域名。 我们的页面加载之后会立即通过静默授权跳转去拿用户的code以换取openid,来实现自动登录,为了减少跳转,我们在微信公众号的自定义菜单中配置的链接就是微信的授权链接 https://open.weixin.qq.com/connect/oauth2/author

技术

VS2015打包程序无法在XP下安装的问题

问题描述 最近有个需求,需要做一个WinForm程序,目标机器基本都是比较旧的XP机器。需要安装.net Framework环境以及添加快捷方式等,所以决定做一个安装程序。VS默认的是推荐使用InstallShield Limited Edition,经过尝试,发现实在不好用,而且Limited版还有不少限制。于是想用以前VS版本中的Installer Project。寻找了一下,发现有2015版的插件(Microsoft Visual Studio 2015 Installer Projects [https://visualstudiogallery.msdn.microsoft.com/003f3135-bbca-4eb2-951d-88820065a124] )。其他都很顺利,在Win7、Win8.1、Win10中安装都没有问题。唯独当我不远万里来到目标机器的时候,发现在XP系统上安装失败!安装程序莫名退出。纠结了几天,最终在网上搜到了解决方案。原因是这样,在VS2010之后的VS中,dpca.dll这个文件中最低的Windows版本已经不支持XP了,导致在用2010以上的VS