문제

내 경험에서 하나의 더 큰 문제는 우리가 우연히 만나는 동안 우리의 webdevelopment 프로세스가지 다른 설정을 업데이트 및 보안에 따른 서버에 있습니다.

회사는 그것의 자신의 CMS 현재 설치된 전 100+서버입니다.지금이 순간,우리가 사용하여 해킹 틱 FTP-기반 접근 방법,결합으로 업그레이드 스크립트를 특정 위치에서 업그레이드하는 우리의 모든 CMS 설정하였습니다.을 효율적으로 관리하기 위해 이러한 설정이 점점 더 어려워지고 위험한 여러 가지가있을 때 사용자 정의 모듈에 참여합니다.

  • 가장 좋은 방법이 무엇인지를 여러 개 설정의 웹 응용 프로그램이 안전하고 up-to-date?
  • 어떻게 당신 니까?
  • 어떤 특정 팁에 관한 모듈화된 응용 프로그램을 유지하기 위해 유연성으로 우리의 클라이언트,하지만 여전히 수 있는 효율적으로 관리하고"여러 가지"의 응용 프로그램?

어떤 상황에 맞는 정보:우리는 주로 개발에 램프-스택입니다.의 주요 요인 중 하나는 데 도움이 되는 판매하는 우리의 CMS 은 우리가 할 수 있는 플러그인은 거의 아무것도 우리의 클라이언트를 원한다.이는 매우에서 10 10.000 의 라인을 사용자 지정 코드입니다.

많은 사용자 지정 작업의 아주 작은 조각의 코드관리 이 모든 작은 조각의 코드로 전복에 보이 매우 지루하고 비효율 저에(이후 우리는 주위에 2 개의 웹사이트에 매주,그 결과 의 지점은 불가).

무언가가 있다면 나는 전에,나는 그것을 듣고 싶습니다.

미리 감사드립니다.


모집: 첫째,모든 주셔서 감사합니다 당신의 답변이 있습니다.이들 모두 정말 도움이 됩니다.

나는 사용할 가능성이 높 SVN-기반 접근 방법을 만드는 benlumley의 솔루션은 가장 가까운 것을 내가 사용하는 것입니다.부터 이 질문에 대답과 다를 수 있습 다 쓰임새,나는 받아들이 대답으로 가장 많은 표를 끝에서 실행됩니다.

시기 바랍 검사 답변하는 것들에 대한 투표는 당신이 생각하는 가장 가치를 추가했습니다.

도움이 되었습니까?

해결책

버전 제어 시스템을 사용하고 수정 해야하는 코드의 일부를 "분기"하는 것이 견고성과 효율성 측면에서 최상의 접근법이 될 수 있다고 생각합니다.

분산 버전 시스템은 필요에 가장 적합 할 수 있습니다. 왜냐하면 필요한 경우 일부 변경 사항을 유지하면서 다른 "분기"에서 "코어"기능을 원활하게 업데이트 할 수 있기 때문입니다.

편집하다: 분산 버전 시스템으로 최신 상태를 유지하는 모든 것을 기대하는 것보다 훨씬 지루할 것이라고 확신합니다. 다른 곳에서는 다른 곳에서는 필요하지 않을 것이며 분산 된 변경 사항을 유지할 수 있습니다. 측면은 배포 된 각 애플리케이션이 실제로 다른 응용 프로그램과 독립적이며 전파되는 수정 사항 만 전파됩니다.

다른 팁

애플리케이션을 사용자 정의하는 데 많은 작은 코드를 변경하는 경우 응용 프로그램의 디자인이 결함이 있다는 신호일 수 있습니다. 애플리케이션에는 안정적인 핵심 코드 세트, 사용자 정의 라이브러리가 연결할 수있는 확장 지점, 템플릿을 사용하여 모양을 변경할 수있는 기능 및 구성 파일을 사용하여 동작을 변경하고 플러그인을 설치하는 기능이 있어야합니다. 이런 식으로, 모든 클라이언트에 대해 별도의 SVN 지점이 필요하지 않습니다. 오히려 핵심 코드 및 확장 플러그인 라이브러리를 소스 제어에서 정상적으로 유지하십시오. 다른 저장소에서는 각 클라이언트의 폴더를 만들고 모든 템플릿과 구성 파일을 유지하십시오.

현재로서는 SVN 브랜치를 만드는 것이 정신을 유지하는 데 도움이되는 유일한 솔루션 일 수 있습니다. 현재 상태에서는 실수를 저지르고 고객의 사이트를 엉망으로 만드는 것이 거의 불가피합니다. 최소한 분기의 경우 각 클라이언트에 대한 안정적인 코드 기반이 보장됩니다. SVN 브랜치가있는 유일한 gotcha는 분기에서 파일을 이동하거나 바꾸면 트렁크로 다시 변경하는 것이 불가능합니다 (수동으로 수행해야합니다).

행운을 빕니다!

편집 : 위에서 설명한 모든 원리를 사용하여 잘 설계된 응용 프로그램의 예는 참조하십시오. 마젠토 전자 상거래. Magento는 지금까지 작업 한 웹 애플리케이션을 사용자 정의하기가 가장 강력하고 확장 가능하며 쉽게 사용자 정의 할 수 있습니다.

나는 틀렸을 지 모르지만 Aron이 뒤 따르는 것은 나에게 ~ 아니다 버전 제어. 버전 작성은 훌륭하고 이미 사용하고 있다고 확신하지만 수백 개의 맞춤형 설치에 대한 업데이트를 관리하려면 다른 것이 필요합니다.

나는 a의 선을 따라 무언가를 생각하고있다 목적으로 만들어진 패키지 시스템. 모든 버전의 모듈이 개별 종속성과 '보장 된 호환성'을 추적 하고이 정보를 사용하여 '안전한'모듈 만 자동 업데이트하기를 원합니다.

예를 들어 'Wiki'모듈의 새 버전 3을 만들었습니다. 애플리케이션을 실행하는 모든 서버로 새 버전을 전파하려고하지만 버전 2 이후 Wiki 모듈 내의 인터페이스 중 하나를 변경했습니다. 이제 모든 기본 설치의 경우 문제는 없지만 중단됩니다. 이전 인터페이스 위에 사용자 정의 확장 기능이있는 설치. 잘 계획된 패키지 시스템이이를 처리 할 것입니다.

보안 문제를 해결하려면 패치에 디지털 서명을 사용해야합니다. 공개 키 기반 서명에 사용할 수있는 좋은 라이브러리가 많이 있으므로 선택한 플랫폼의 표준 인 것처럼 보이십시오.

지 여부를 확인 누군가가 이것을 말했다,많은 긴 반응기,그리고 나는 그들 모두를 읽어보십시오.

내가 생각하는 더 나은 방법을 당신의 버전을 제어하는 것입 CMS 에 앉아 자신에 자신의 저장소 및 각 프로젝트에서 자체.(또는 이러한 모든 수위 폴더에 repo 나의 추측)

할 수 있습니다 다음 사용의 트렁크(또는 특정점/태그를 당신이 선호하는 경우)로 svn:외부에서는 각 프로젝트가 필요합니다.이 방법은 어떤 업데이트 CMS 에 위치로 적용할 수 있습니다 다시 저장소 및게 될 것입니다 다른 프로젝트 프로그램을 다운로드하고 그것 svn 업데이트(또는 외부 svn:스위치'ed).

의 일환으로 만들이 쉽게 당신이 필요가 있는지 확인 CMS 및 사용자 정의 기능에 앉아서 서로 다른 폴더에,그래서는 svn 외부 부품이 제대로 작동합니다.

IE:

project
 project/cms <-- cms here, via svn external
 project/lib <-- custom bits here
 project/www <-- folder to point apache/iis at

(있을 수 있습 cms 및 lib 에서 www 폴더에 필요한 경우)

이것은 당신이 지점/태그 각 프로젝트습니다.할 수도 있습니다 스위치 svn:외부에 위치 지점당/꼬리표 기준입니다.

는 측면에서 변경 라이브에,나는 당신이 즉시 제거 ftp 를 사용하여 재동기화 또는 svn checkout/수출하고 있습니다.모두 작업을 잘하고,선택은 당신입니다.

나는 가장 경험을 가진 재동기화 경로,rsyncing svn 수출하는 서버입니다.는 경우 아래로 이동이 경로를 쓰기,쉘 스크립트,그리고 당신을 만들 수 있습 테스트 쉘 스크립트를 당신을 보여 파일을 업로드 할 것입 업로드하지 않고 뿐만 아니라 그들을 사용하여,-n 플래그입니다.나는 일반적으로 사용하는 한 쌍의 스크립트를 각각의 환경에 대한 하나-테스트,그리고는 하나 실제로 그것을 할 수 있습니다.

Shared key 인증도 필요하지 않습 암호를 보낼 업로드할 수도 있습 유용한 방법에 따라 안전한 서버 액세스 권한이 부여됩니다.

수도 있습 유지하는 또 다른 쉘 스크립트를 하기를 위한 대량의 업그레이드,단순히 통화 관련 쉘 스크립트를 위해 각 프로젝트의 당신이 원하는 업그레이드합니다.

Drupal을 보셨습니까? 아니요, 가지고있는 것을 배포하고 교체하지 말고 사용자 정의 및 사이트 별 모듈을 처리하는 방법을 확인하십시오.

기본적으로 호스팅하는 모든 사이트에 대한 디렉토리가있는 "사이트"폴더가 있습니다. 각 폴더 내에는 별도의 settings.php가있어 다른 데이터베이스를 지정할 수 있습니다. 마지막으로 (선택적으로) 사이트 내에 "테마"및 "모듈"폴더를 가질 수 있습니다.

이를 통해 특정 모듈의 사이트 별 사용자 정의를 수행하고 특정 모듈을 해당 사이트로 제한 할 수 있습니다. 결과적으로, 당신은 모든 것의 대부분이 완벽하게 동일하고 차이 만 복제 된 사이트로 끝납니다. 업그레이드 및 업데이트를 처리하는 방식과 결합하면 실행 가능한 모델이있을 수 있습니다.

를 구축으로 코드를 자동 업데이트 과정입니다.
그것은 것입 업데이트가 있는지 확인하고 그들을 실행 when/where/어떻게 구성한 클라이언트입니다.

을 만들어야합니다 어떤 종류의 모듈 목록(사용자 지정 또는지)을 테스트해야 하는 새로운 구축하기 전에이다.배포할 때 업데이트할 수 있도록 이들을 테스트하고 통합습니다.희망이 당신의 디자인이 처리 할 수 있습니다.

업데이트를 이상적으로 몇 가지 주요 단계가 있습니다.

  1. a) 백업할 수 있습니다. 당신이해야 할 수 밖으로 돌아 전체 업데이트합니다.그래서, 는 것을 의미를 만드는 로컬 보관 의 응용 프로그램 및 데이터베이스 첫째.

    b) 업데이트하 모니터링 프로세스 -가 CMS 시스템은 휴대 전화 가정을 보는 새로운 건축.

    c) 일정에 업데이트 가용성 -기회는 당신을 원하지 않 업데이트를 실행하여 두 번째로 그것을 사용할 수 있습니다.이것은 당신을 만들어야 cron/에이전트의 일부 작업을 수행 할 수있는 시스템에서 자동으로 업데이트합니다.고려할 수 있습니다 또한 클라이언트의 요구 사항을 업데이트하고,주말에 또는에서 특정한 일입니다.할 수도 있습니다 비틀거리 출신 업데이트하지 않도록 업데이트 1000 클라이언트에서 1 일로 얻는 기술 지원 지옥입니다.비틀거리의 어떤 도움이 될 수 있습니다.

    d) 추가 유지 보수 모드는 사이트를 업데이트 --걷어 사이트으로 유지 관리 모드에 있습니다.

    e) SVN checkout 또는 다운로드 패키지 --이상적으로 배포할 수 있습을 통해 svn checkout,그렇지 않은 경우,설치 서버에 전달하 svn 생성된 패키지로 아카이브에 배포할 수 있는 클라이언트 사이트입니다.

    f) 배포하는 스크립트는 DB -백업 데이터베이스,업데이트들을 채울

    g) Update 사이트 코드 -이 모든 작업을 한 단계입니다.

    h) 테스트니다. 있는 경우 자 테스트에 내장,그것은 이상적인 것입니다.

여기 내가하는 일이 있습니다 ...

클라이언트 별 경로 포함

  • 공유, 공통 코드가 있습니다 공유/current_version/lib/
  • 사이트 별 코드가 있습니다 클라이언트/foo.com/lib
  • 포함 경로는 다음으로 포함하도록 설정됩니다 클라이언트/foo.com/lib, 그리고 공유/lib
  • 모든 것은 버전 제어 시스템에 있습니다

이를 통해 코드는 가능한 한 공유 파일을 사용하지만 어떤 이유로 특정 클래스 나 파일을 무시 해야하는 경우 폴더에 클라이언트 특정 버전을 작성할 수 있습니다.

별칭 공통 파일

내 가상 호스트 구성에는 선이 포함됩니다

Alias /common <path>/shared/current_version/public_html/common

프로젝트에서 공통 UI 요소, 아이콘 등을 공유 할 수 있습니다.

각 사이트 릴리스에 공통 코드를 태그하십시오

각 사이트 릴리스 후, 나는 그 시점을 효과적으로 동결시키기 위해 분기를 만들어 공통 코드를 태그합니다. 이를 통해 라이브 서버에 배포/공유/version_xyz/를 배포 할 수 있습니다. 그런 다음 가상 호스트가 공통 파일의 특정 버전을 사용하거나 최신 업데이트를 선택하려면 current_version을 가리키게 할 수 있습니다.

다음과 같은 도구를 살펴 보셨습니까? 인형 (앱 배포 포함 시스템 관리) 또는 Capistrano (RubyOnrails에서 앱을 배포하지만 이에 국한되지는 않습니까)?

한 가지 옵션은 읽기 전용 버전 제어 시스템 (파괴)을 설정하는 것입니다. 저장소에 대한 액세스를 CMS에 통합하고 메뉴를 통해 업데이트를 호출하거나 사용자가 업데이트에 대한 선택을 원하지 않는 경우 자동으로 (중요 할 수 있음) 자동으로 업데이트를 호출 할 수 있습니다. 버전 제어 시스템을 사용하면 다른 지점을 쉽게 유지할 수 있습니다.

사람들이 이미 언급했듯이 버전 제어 (기능으로 인해 전복을 선호하는)와 분기를 사용하는 것이 최선의 선택이 될 것이라고 언급했습니다. CruiseControl이라는 SourceForge에서 사용할 수있는 또 다른 오픈 소스 소프트웨어. 놀랍게도 Sach의 전복으로 Cruisecontrol을 구성합니다. 서버션에 추가 된 코드 수정 또는 새 코드가 자동으로 알 수 있으며 귀하를 위해 구축됩니다. 그것은 당신의 지옥의 시간을 구할 것입니다.

나는 회사에서도 같은 방식으로 해냈습니다. 4 개의 프로젝트가 있으며 다른 서버에 해당 프로젝트를 배포해야합니다. 코드베이스의 모든 수정이 자동 빌드를 트리거하는 방식으로 CruiseConrol을 설정했습니다. 그리고 다른 스크립트가 서버에서 빌드하는 배포를 배포합니다. 당신은 가기에 좋습니다.

램프 스택을 사용하는 경우 솔루션 파일을 분포 패키지로 바꾸고 변경 사항을 전파하는 데 사용합니다. RPM 때문에 Redhat/Fedora를 추천하며 경험이있는 것입니다. 어쨌든 당신은 데비안 기반 분포도 사용할 수 있습니다.

언젠가는 ISP 호스팅 서버를 관리하기위한 램프 솔루션을 만들었습니다. 그들은 웹 호스팅을 관리 할 여러 서버가 있었고 모든 기계가 자체 포함되어 온라인 관리자가 있었기 때문에 관리자의 변경 사항을 배포 할 수있는 방법이 필요했습니다. 솔루션 파일 (주로 PHP)이 포함 된 RPM 패키지와 RPM으로 실행되는 일부 배포 스크립트를 만들었습니다.

자동 업데이트를 위해 yum.conf의 모든 서버에 자체 RPM 저장소가 설정되었습니다. 신뢰할 수있는 저장소의 최신 RPM으로 서버를 매일 업데이트하기 위해 Crontab 작업을 설정했습니다.

RPM 패키지에서 공개 키 파일로 서명하고 서명 된 패키지 만 수락하는 등 RPM 패키지에서 신뢰 설정을 사용할 수 있기 때문에 신뢰도도 달성 할 수 있습니다.

HM 구성 파일을 추가하는 것이 아이디어 일 수 있습니까? 당신은 많은 작은 대본이 무언가를하고 있다고 썼습니다. 이제 소스로 빌드하고 구성 파일로 조종했다면 그렇게 "편안"하지 않아야합니까?

반면에 모든 고객에 대한 지점을 갖는 것은 나에게 지수의 성장처럼 보입니다. 그리고 당신이 어떤 영역을 한 영역을 어떻게 "알 수 있고 다른 모든 지점에서"변화를 "하는 것을 잊지 않는 방법. 그것은 나에게 꽤 못 생겼다.

개정 제어, 구성 옵션 및/또는 배포 영수증의 조합이 "좋은"아이디어 인 것 같습니다 .....

핵심 소프트웨어에 대한 많은 변형을 통해 트렁크에서 개별 클라이언트 사이트로 업데이트를 푸시하는 것 이상을 유지하려면 버전 제어 시스템이 필요하다고 생각합니다.

따라서 전복이 지루할 것이라고 생각한다면, 당신은 고통 지점이 무엇인지에 대해 좋은 의미를 가지고 있습니다 ... 개인적으로, 나는 분기를 관리하고 추적하는 데 실제로 좋지 않기 때문에 이것에 대한 파괴를 추천하지 않을 것입니다. 핵심 소프트웨어에 외부를 사용하겠다는 Benlumley의 제안은 좋은 것이지만 클라이언트 사이트의 핵심 코드를 조정 해야하는 경우 해체됩니다.

버전 제어를 위해 GIT를 살펴보면 분기를 위해 만들어졌으며 빠릅니다.

배포 관리를 위해 Capistrano를 확인하십시오. 그것은 종종 레일과 함께 사용되는 루비 스크립트이지만 원격 서버, 심지어 루비가 아닌 사이트의 모든 종류의 파일 관리에 사용할 수 있습니다. FTP, SCP, RSYNC를 포함한 다양한 스트라지기를 통해 컨텐츠를 원격 끝으로 가져올 수 있으며 저장소에서 최신 버전을 자동으로 확인할 수 있습니다. 그것이 제공하는 좋은 기능에는 배포 프로세스의 모든 단계에 대한 콜백 후크 (예 : 버전 제어에 있지 않은 사이트 별 구성 파일을 복사 할 수 있음) 및 Symlinks를 통해 제공되는 릴리스 로그 시스템이 포함됩니다. 문제가 발생한 경우 이전 릴리스로 빠르게 롤백 할 수 있습니다.

분기 목록과 호스팅 된 위치가있는 구성 파일을 추천 한 다음 각 지점을 차례로 확인하고 최신 변경 사항을 업로드하는 스크립트를 사용하여 실행합니다. 이것은 자동으로 야간 업데이트를 수행하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top