.net 배포시스템, 모니터링 인프라 구축 - (1) 시작전


몇번의 .Net framework 기반 프로젝트 배포 시스템을 구축한 경험을 정리,
공유 하고자 합니다.

정리한 내용들을 바탕으로 .Net 웹 응용프로그램 (asp.net) 이나 어플리케이션들이 .net 자동화 배포 솔루션? 프로젝트로 진행 하고자함


배포 인프라 구축시 사용 환경

 형상관리 - git (bitbucket) , tfs
 개발 - ASP.NET MVC 4.5 (include Webform2.0), Windows Service  (c#)
 컴파일 -msbuild
 CI - jenkins
 파일 전송 - rsync, robocopy
 SMS 발송 - slack


아래는 내부적으로 사용하고 있는 정기점검 프로그램
실행시 jenkins 조회 및 실행, xml파일 생성, 파일 배포등을 수행



왜 jenkins로 실행하지 않고 wrapping한 프로그램을 만들어 사용하는가? 

jenkins 화면을 외부 운영자에게 노출, 공유하기 쉽지 않아서
job 실행, 상태조회만 배포 솔루션으로써 사용할 수 있도록 만든 화면이 필요했음.


앞으로 짬날때 마다 천천히 정리할 예정.

크롬앱 - Readability [html 읽기모드]




아이폰 사파리에서 읽기 모드를 하면 웹페이지가 본문만 읽기 편하게 렌더링 되는것이 편해 PC용으로 비슷한 기능을 사용할 수 있도록 만든 플러그인입니다.
웹페이지에서 본문 필터링 렌더링의 엔진은
arc90 오픈소스를 활용 하였습니다.


아래 링크를 통해 설치할 수 있습니다.

https://chrome.google.com/webstore/detail/readability/gecalmamhkdlancogmdcimbkonhjoini?utm_source=plus

ver0.1 초안
ver0.2 렌더링시 본문 이미지 정렬, 본문 영역 800px -> fullsize로 변경








윈도우 호스트 파일 관리자

윈도우 호스트 파일 관리자
웹개발을 하다보면 host를 지정하고 로컬 PC에서 테스트를 해야한다. (dev/ stg/ live등등등)
보통 윈도우 호스트 파일을 변경해서 사용하나,
본인은 fiddler의 Host Remapping 기능을 선호한다. 자체 proxy port를 열어 바로바로 적용이 되기 때문.
하지만 fiddler의 웹 캡쳐기능이 사내 보안프로그램과 충돌, 강제종료 되는 경우가 요즘들어 부쩍 많아졌다.

하는수 없이 호스트 파일을 fiddler와 같이 바로 변경/적용할 수 있는 간단한 프로그램을 개발했는데 사용 방법은 아래와 같다.

사용 방법: 실행하면 윈도우 아이콘으로 활성됨.
해당 아이콘 클릭-> 관리창 열기 -> 필요 ip -host 입력후 적용 -> 다시 아이콘 클릭-> 동작->  적용 || 초기화 || 자동 초기화 & 적용

적용: 관리창의 호스트로 적용됨을 의미
초기화: 적용하지 않음을 의미. (호스트파일이 원복 된다.)

해당 기능이 정상 작동 되려면 호스트 파일 수정 권한이 있어야한다.
보통 윈도우 호스트파일은 수정 금지로 설정된 경우가 있는데, 수정 허용하면 된다

언제든 기능 개선, 추가, 지적, 아이디어, 직접 수정후 공유 모두 환영합니다.

%ec%ba%a1%ec%b2%98


github : 소스코드는 아래에 있습니다.
https://github.com/juster111/hostsmanager
실행파일 :아래 경로에서 download 클릭.  https://github.com/juster111/hostsmanager/blob/master/hostsmanager/bin/Release/hostsmanager.exe

ver 1.1  업데이트———-
프로그램 시작시 default 추가 (호스트 입력후 저장, 프로그램 종료하면 재시작시 그대로 설정되어있도록 수정 :: hostmanager.txt 파일로 관리)
txt 불러오기기능 추가
아이콘 변경

[DATAZEN] ms 통계툴 설치 가이드



[설치]
http://www.datazen.com/start/

설치는 아래 두가지를 해야함.
1. Datazen Enterprise Server
2. Datazen Publisher Apps -> Dashboard를 생성하거나, 엑셀/DB등 데이터 바인딩하는 앱


[서버 구성요소]
Core Service

  • 저장소를 포함한 윈도우서비스  
  • users, KPIs, dashboards, data view등의 저장소
  • 방대한 데이터에 빠르게 액세스 할수 있도록 디자인 

Data Acquisition Service

  • 주기적으로 질의된 외부 데이터소스 와 캐시데이터를 가지고 있는 Core Service내 윈도우 서비스 

Web Applications

  • Web API 
  • Control Panel - 관리자
  • Viewer 

[authentication mode]

  • default - core service 저장소내 저장
  • AD - core service내 username 저장 pw는 ad환경
  • ADFS - core service 내 username 저장, 자격증명은 설치된 ADFS에 의해 증명함.
  • external - HTTP header나 쿠키등을 활용해 외부와 인증

Datazen 서버 설치시 두가지 키를 제공
Repository Encryption key -> Core Repository를 복구할때 사용
Instance Id -> 분산컴포넌트를 사용할때 사용


설치가 끝나면,
(최초 설정하는 비밀번호가 datazen 관리자 페이지 비밀번호이므로 잘 기억해야함)
Core Service 계정 초기화
netsh http delete urlacl url=http://+:28952/
netsh http delete urlacl url=http://+:28953/
netsh http delete urlacl url=https://+:28953/
netsh http add urlacl url=http://+:28952/ user=[new service account username]
netsh http add urlacl url=https://+:28953/ user=[new service account username]


81번 port로 자동 IIS 세팅.아래 경로로 접근 가능

[경로]
관리 로그인 페이지: http://localhost:81/cp/Account/Login?ReturnUrl=%2fcp
통계 뷰페이지: http://localhost:81/viewer/home#/dashboards/0


[built-in data providers]
-sql server  -  data view query 에서 바로 가능
-sql server  - analysis services    mdx 쿼리
-sharepoint   -  list name
-odata webservice
-xml webservice
-mysql  - odbc driver 설치해야함
-oracle 도 마찬가지
-postgresql db 가능
-엑셀 가능





[메뉴명]

BI hubs ->
users, dashboards, KPIs, data등의 관리하는 최상위 계층.
하나의 Datazen Server에서 여러개의 BI hubs를 동시에 각기 다른 roles과 view로 제공 가능하다.

KPI -> 목표 단위 설정합니다.  각 value는 쿼리, 직접입력이 가능.


Datasources -> Data Connection Pool (Store)
1) DataSource를 생성  (instance)


2) Dataview를 생성  
  (refresh frequency를 설정할수 있음, 파라미터 받아서 처리도 가능 )



Dashboards
1) Datazen Publisher를 통해 페이지 레이아웃을 잡는다.
  (PC/모바일/태블릿에 따라 레이아웃을 다르게 설정한다)


2) Dashboards -> DataView
선택한 콘트롤을 선택하고 바인딩하려는 데이터를 Add Data 버튼을 눌러 바인딩한다.

3) Datasources 에서 만들어놓은 pool과 매핑 또는 엑셀로 매핑






Publish



결과화면

[sandcastle] C# 자동 라이브러리 문서화 툴

sandcastle 이라는 프로그램은?

내 코드를 아래와 같이 라이브러리 형태로 자동 문서화 해주는 툴.
자체 옵션에 멤버, private , protected, 별로 노출 여부 설정 가능.
옵션이 굉장히 다양.
하나의 도움말 사이트로써 ,
링크나 별도 설명등도 잘사용하면 모두 이용가능. (XML 문법을 잘 사용할 경우 더 좋음)
(.net web api로 만들면 .net framework에서 자동으로 만들어 줍니다..)
아래는 샘플의 결과물








설치 시작
소스 src
http://sandcastle.codeplex.com/
https://github.com/EWSoftware/SHFB
하나는 라이브러리, 하나는 sandcastle helper file GUI

둘다 설치.
설치가 다되면 "sandcastle helper file GUI" 앱 실행

아래와 같이 간략한 테스트 콘솔 프로그램을 작성.
도움말의 설명은 아래와 같은 summary 주석 기반... (그래서 소스코드보다 주석이 더 많아질수 있다....)





빌드구성을 아래와 같이 XML문서 생성에 체크해주어야 함.


아래와 같이 exe와 xml 을 또는 참조하려는 dll을 추가.


 노출되는 구성은 아래와같이 chm, 웹형태, docx, mshc형태로 제공.
















빌드프로젝트 ,ctrl+shift+B!!  웹형태로 결과를 실행.
아래와같이 index.html이 생성.





































아래와 같이 메서드들이 보임. Hello 메서드를 들어가보면










설명 제공. 아래 빨간 글은 summary 주석에 return value가 빠졌기때문에 나오고,
이러한 warning 타입을 옵션에서 제거해도 되고, summry에서 추가하여 좀더 자세히 보게끔 할수도 있다.



















[asp.net] ip-dns간 호스트 매핑

웹개발을 하다보면 서버별로 페이지를 확인해야 할 경우가 많다.

 호스트 파일을 사용하거나,
 fiddler에서 Host remapping 기능을 사용하거나
 어떤 프로그램을 사용하건,

여러 서버를 둔 api 서비스라거나 여러 서비스들에서 캐시를 이용해 서비스되는데
캐시를 바로 삭제 해야할 필요가있다.

ip를 지정해 해당 도메인에 접근하려면,


webproxy에 ip를 할당하거나 또는 아래




1.
   HttpWebRequest request = (HttpWebRequest)WebRequest.Create("namasg.blogspot.kr");
                    request.Referer = domainHost;
                    request.Proxy = new WebProxy(http://127.0.0.1);
                    using (WebResponse response = request.GetResponse())
                    {}



2.
   //private string WebRequest_()
        //{


        //    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ip);
        //    FieldInfo headersFieldInfo = request.GetType().GetField("_HttpRequestHeaders", System.Reflection.BindingFlags.NonPublic
        //                                          | System.Reflection.BindingFlags.Instance
        //                                          | System.Reflection.BindingFlags.GetField);
        //    CusteredHeaderCollection WssHeaders = new CusteredHeaderCollection(dns);
        //    headersFieldInfo.SetValue(request, WssHeaders);
        //    request.Proxy = null;
        //    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        //    StreamReader sr = new StreamReader(response.GetResponseStream());
        //    return sr.ReadToEnd();

        //}
        //public class CusteredHeaderCollection : WebHeaderCollection
        //{
        //    public bool HostHeaderValueReplaced { get; private set; }

        //    public string ClusterUrl { get; private set; }

        //    public CusteredHeaderCollection(string commonClusterUrl)
        //        : base()
        //    {
        //        if (string.IsNullOrEmpty("commonClusterUrl"))
        //            throw new ArgumentNullException("commonClusterUrl");

        //        this.ClusterUrl = commonClusterUrl;
        //    }

        //    public override string ToString()
        //    {
        //        this["Host"] = this.ClusterUrl;
        //        string tmp = base.ToString();
        //        this.HostHeaderValueReplaced = true;
        //        return tmp;
        //    }
        //}