# SSH 키를 사용하여 사설 저장소에 호스팅된 Discourse 플러그인을 설치하는 방법?

**URL:** https://meta.discourse.org/t/how-to-install-discourse-plugins-hosted-in-private-repositories-using-ssh-key/375854
**Category:** Self-hosting
**Created:** [7월 25, 2025, 5:16오후 UTC](https://meta.discourse.org/t/how-to-install-discourse-plugins-hosted-in-private-repositories-using-ssh-key/375854 "2025-07-25T17:16:18Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![copymonopoly](https://avatars.discourse-cdn.com/v4/letter/c/4491bb/32.png) [@copymonopoly](https://meta.discourse.org/u/copymonopoly)
#### Post date: [7월 25, 2025, 5:16오후 UTC](https://meta.discourse.org/t/how-to-install-discourse-plugins-hosted-in-private-repositories-using-ssh-key/375854/1 "2025-07-25T17:16:18Z")

</div>

자체 호스팅 사이트에서 플러그인을 설치하는 공식 Discourse 가이드([공식 튜토리얼](https://meta.discourse.org/t/install-plugins-on-a-self-hosted-site))를 따랐지만, 이 가이드는 2014년에 작성된 것으로 현재 많은 정보가 구식일 가능성이 높다고 생각합니다.

또한, 토론 댓글에서 권장된 비교적 최신 해결책 중 일부, 예를 들어 볼륨을 통해 SSH 키를 마운트하고 부트스트랩 과정에서 SSH 액세스를 구성하는 방법도 시도해 보았습니다. 그러나 이러한 노력에도 불구하고 여전히 SSH를 사용하여 사설 Git 저장소에서 플러그인을 클론하고 설치하지 못했습니다.

사설 저장소에서 SSH 키를 사용해 Discourse 플러그인을 설치하는 최신 작동 방법이나 모범 사례를 알고 계신 분이라면, 여러분의 조언을 간절히 부탁드립니다.

---

<div class="post-metadata">

### Author: ![copymonopoly](https://avatars.discourse-cdn.com/v4/letter/c/4491bb/32.png) [@copymonopoly](https://meta.discourse.org/u/copymonopoly)
#### Post date: [7월 25, 2025, 5:18오후 UTC](https://meta.discourse.org/t/how-to-install-discourse-plugins-hosted-in-private-repositories-using-ssh-key/375854/2 "2025-07-25T17:18:54Z")

</div>

Discourse 부트스트랩 과정에서 GitHub에서 다시 가져오지 않도록, 플러그인 파일을 미리 서버에 직접 다운로드할 수 있는 방법이 있을까요?

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [7월 25, 2025, 5:54오후 UTC](https://meta.discourse.org/t/how-to-install-discourse-plugins-hosted-in-private-repositories-using-ssh-key/375854/3 "2025-07-25T17:54:09Z")

</div>

> [@Discourse](#):
>
> OAuth 토큰을 사용하면 공개 저장소와 동일한 방식으로 플러그인을 설치할 수 있으며, SSH 키를 만들 필요가 없습니다.

이것은 여전히 유효한 방법입니다.

저는 항상 이렇게 사용하고 있습니다.

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [7월 26, 2025, 2:27오전 UTC](https://meta.discourse.org/t/how-to-install-discourse-plugins-hosted-in-private-repositories-using-ssh-key/375854/4 "2025-07-26T02:27:42Z")

</div>

> [@copymonopoly](#):
>
> 플러그인 파일을 미리 서버에 직접 다운로드하는 방법이 있을까요?

다음을 /plugins 폴더로 직접 클론한 후 필요한 마이그레이션을 실행하면 되겠지만, 그렇게 하면 플러그인 업데이트를 받지 못할 수 있습니다.

---

<div class="post-metadata">

### Author: ![copymonopoly](https://avatars.discourse-cdn.com/v4/letter/c/4491bb/32.png) [@copymonopoly](https://meta.discourse.org/u/copymonopoly)
#### Post date: [7월 26, 2025, 4:20오전 UTC](https://meta.discourse.org/t/how-to-install-discourse-plugins-hosted-in-private-repositories-using-ssh-key/375854/5 "2025-07-26T04:20:51Z")

</div>

감사합니다! 그런데 SSH를 선호하는 이유는 OAuth 토큰은 읽기 권한과 쓰기 권한을 분리할 수 없기 때문입니다. 항상 필요한 것보다 더 많은 접근 권한이 함께 부여됩니다.

SSH를 사용하면 읽기 전용 배포 키를 생성할 수 있으며, 이는 더 안전하고 최소 권한 원칙에 더 부합합니다.

---

<div class="post-metadata">

### Author: ![copymonopoly](https://avatars.discourse-cdn.com/v4/letter/c/4491bb/32.png) [@copymonopoly](https://meta.discourse.org/u/copymonopoly)
#### Post date: [7월 26, 2025, 4:23오전 UTC](https://meta.discourse.org/t/how-to-install-discourse-plugins-hosted-in-private-repositories-using-ssh-key/375854/6 "2025-07-26T04:23:10Z")

</div>

> [@NateDhaliwal](#):
>
> 파일을 /plugins 디렉터리로 직접 클론한 후 필요한 마이그레이션을 실행할 수 있지만, 그렇게 하면 플러그인 업데이트를 받을 수 없을 수 있습니다.

좋은 제안 감사합니다!

실제로 플러그인을 `/var/www/discourse/plugins` 경로로 직접 클론해 보았지만, 플러그인 폴더를 호스트에서 컨테이너 내 해당 경로로 마운트한 경우를 제외하고는 작동하지 않았습니다.

부트스트랩 과정에서 Discourse가 Git을 통해 플러그인을 가져오도록 기대하는 것 같고, 플러그인 파일을 수동으로 배치하는 것만으로는 이 단계를 우회할 수 없는 것 같습니다.

이 방법으로 성공하신 경험이 있다면, 더 자세한 내용을 듣고 싶습니다.

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [7월 26, 2025, 5:24오전 UTC](https://meta.discourse.org/t/how-to-install-discourse-plugins-hosted-in-private-repositories-using-ssh-key/375854/7 "2025-07-26T05:24:23Z")

</div>

기억이 맞다면 직접 클론을 생성할 때 문제가 발생한다고 들었습니다([이 글](https://meta.discourse.org/t/rebuild-the-forum-using-code/352173/8?u=natedhaliwal)을 참고해 주세요). 그래서 토큰을 사용해 클론을 생성하는 것이 권장되는 방식입니다.

하지만 SSH 키를 사용하시려면 아래 방법을 시도해 보시는 것이 좋겠습니다:

> [@Discourse](#):
>
> 비공개 저장소의 플러그인에는 OAuth 토큰 사용을 강력히 권장합니다. 그러나 불가능한 경우 아래 내용을 참고하세요.
> 
> SSH 키를 통한 비공개 설치 단계
> 
> - 비공개 git 저장소가 GitHub에 호스팅되어 있다고 가정할 때, 서버 사용자의 공개 SSH 키를 GitHub 저장소의 Deploy keys([https://github.com/SecretOrg/secret-plugin/settings/keys](https://github.com/SecretOrg/secret-plugin/settings/keys))에 추가해야 합니다.
> - 아래 예시와 같이 `app.yml` 파일을 수정합니다:
> 
> ```plaintext
> run:
> - exec: echo "Beginning of custom commands"
>   
> - exec: cd /var/www/discourse && sudo -u discourse bundle install --deployment --without test --without development
> - exec: echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /user/.ssh/config
> - file:
> path: /user/.ssh/id_rsa
> chmod: 600
> contents: |
> -----BEGIN RSA PRIVATE KEY-----
> MIIEogIBAAKCAQEArCQG213utzqE5YVjTVF5exGRCkE9OuM7LCp/FOuPdoHrFUXk
> .... etc ....
> -----END RSA PRIVATE KEY-----
> - file:
> path: /user/.ssh/id_rsa.pub
> chmod: 600
> contents: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tj .... etc .... user@discourse
> - exec: cd $home/plugins && git clone git@github.com:SecretOrg/secret-plugin.git
> - exec: cd $home && sudo -E -u discourse bundle exec rake db:migrate
> - exec: cd $home && rm -fr tmp/cache
> - exec: cd $home && sudo -E -u discourse bundle exec rake assets:precompile
> - exec: rm /user/.ssh/id_rsa
> - exec: rm /user/.ssh/id_rsa.pub
> 
> - exec: echo "End of custom commands"
> 
> ```
> 
> - 컨테이너를 재빌드합니다:
> 
> ```plaintext
> cd /var/discourse
> ./launcher rebuild app
> 
> ```
> 
> 이제 비공개 플러그인이 Discourse 인스턴스에 설치되어 있어야 합니다.

---

<div class="post-metadata">

### Author: ![copymonopoly](https://avatars.discourse-cdn.com/v4/letter/c/4491bb/32.png) [@copymonopoly](https://meta.discourse.org/u/copymonopoly)
#### Post date: [7월 26, 2025, 6:28오전 UTC](https://meta.discourse.org/t/how-to-install-discourse-plugins-hosted-in-private-repositories-using-ssh-key/375854/8 "2025-07-26T06:28:24Z")

</div>

감사합니다. 하지만 링크해 주신 공식 2014년 가이드에 설명된 방법을 이미 시도해 보았으며, 부트스트랩 과정에서 SSH 키를 사용하여 비공개 저장소에 액세스하는 경우 더 이상 작동하지 않는다는 것을 확인했습니다.

또한, 댓글 중 하나에서 언급된 새로운 접근 방식(SSH 키를 컨테이너에 마운트하고 `after_code`에서 `core.sshCommand`를 설정하는 방법)도 시도해 보았지만, 불행히도 제 경우에도 실패했습니다. Discourse가 비공개 플러그인을 클론할 때 여전히 SSH 권한 오류를 발생시키고 있습니다.

현재 프로덕션 환경에서 SSH를 사용하여 비공개 저장소를 안정적으로 사용할 수 있는 방법이 있다면, 더 최신인 가이드라인을 제공해 주시면 정말 감사하겠습니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [7월 26, 2025, 7:13오전 UTC](https://meta.discourse.org/t/how-to-install-discourse-plugins-hosted-in-private-repositories-using-ssh-key/375854/9 "2025-07-26T07:13:18Z")

</div>

로컬에 클론을 해서 플러그인 디렉터리에 마운트하거나, 임시 마운트에서 플러그인 디렉터리로 복사하는 방법도 있습니다.

예전에는 자격 증명이 URL에 내장된 GitHub URL을 얻을 수 있었습니다. 저는 이전에 그렇게 해본 적이 있습니다.
