<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>삐삐쀼쀼 &amp;mdash; 꿈꾸는 어린 용</title>
    <link>https://blog.daydream.ink/siarte/tag:삐삐쀼쀼</link>
    <description>마스토돈, writefreely 다루는 이야기를 비롯한 일상 이야기.</description>
    <pubDate>Tue, 28 Apr 2026 02:06:50 +0900</pubDate>
    <item>
      <title>writefreely 아이콘 다시 되돌리기</title>
      <link>https://blog.daydream.ink/siarte/writefreely-aikon-dasi-doedolrigi</link>
      <description>&lt;![CDATA[writefreely 설치 및 약간의 소스 수정 후기에서 이미 한 번 수정을 했는데 뭔가 업데이트가 됐는지 다시 이름 기준으로 되돌아왔다.&#xA;&#xA;collections.go에서 AvatarURL 함수에서 strings.Split(c.DisplayTitle(), &#34;/&#34;)[1]를 strings.Split(c.CanonicalURL(), &#34;/&#34;)[3]으로 바꿔줘야한다. 대충 함수 위치만 알아도 알아서 바꿀 수 있지만 또 까먹을까봐 기록해둠...&#xA;&#xA;#writefreely #삐삐쀼쀼&#xA;&#xA;div class=&#34;link-and-banner&#34;&#xD;&#xA;h1배너/h1&#xD;&#xA;&#xD;&#xA;pimg src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/p&#xD;&#xA;p class=&#34;banner-code&#34;textareaa href=&#34;https://blog.daydream.ink/siarte&#34;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/a/textarea/p&#xD;&#xA;/div]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://blog.daydream.ink/siarte/writefreely-seolci-mic-yagganyi-soseu-sujeong-hugi" rel="nofollow">writefreely 설치 및 약간의 소스 수정 후기</a>에서 이미 한 번 수정을 했는데 뭔가 업데이트가 됐는지 다시 이름 기준으로 되돌아왔다.</p>

<p>collections.go에서 AvatarURL 함수에서 strings.Split(c.DisplayTitle(), “/”)[1]를 strings.Split(c.CanonicalURL(), “/”)[3]으로 바꿔줘야한다. 대충 함수 위치만 알아도 알아서 바꿀 수 있지만 또 까먹을까봐 기록해둠...</p>

<p><a href="/siarte/tag:writefreely" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">writefreely</span></a> <a href="/siarte/tag:%EC%82%90%EC%82%90%EC%80%BC%EC%80%BC" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">삐삐쀼쀼</span></a></p>

<div class="link-and-banner">
<h1>배너</h1>

<p><img src="https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp"></p>
<p class="banner-code">&lt;a href=&#34;https://blog.daydream.ink/siarte&#34;&gt;&lt;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;&gt;&lt;/a&gt;</p>
</div>
]]></content:encoded>
      <guid>https://blog.daydream.ink/siarte/writefreely-aikon-dasi-doedolrigi</guid>
      <pubDate>Thu, 22 Aug 2024 14:01:24 +0900</pubDate>
    </item>
    <item>
      <title>Tags</title>
      <link>https://blog.daydream.ink/siarte/tags</link>
      <description>&lt;![CDATA[일상&#xA;  #일기&#xA;  #성인ADHD일기&#xA;  #바람의기억&#xA;  #오늘의삽질&#xA;&#xA;인스턴스 관리&#xA;  #속삭임이고이는별&#xA;  #잃어버린섬&#xA;  #꿈꾸는어린용&#xA;&#xA;서버를 만지거나 컴퓨터를 만지거나&#xA;  #삐삐쀼쀼&#xA;      #mastodon&#xA;      #writefreely&#xA;      #matrix&#xA;&#xA;그 외&#xA; #커미션&#xA; #Vtube윤미르]]&gt;</description>
      <content:encoded><![CDATA[<ul><li><p>일상</p>
<ul><li><a href="/siarte/tag:%EC%9D%BC%EA%B8%B0" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">일기</span></a></li>
<li><a href="/siarte/tag:%EC%84%B1%EC%9D%B8ADHD%EC%9D%BC%EA%B8%B0" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">성인ADHD일기</span></a></li>
<li><a href="/siarte/tag:%EB%B0%94%EB%9E%8C%EC%9D%98%EA%B8%B0%EC%96%B5" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">바람의기억</span></a></li>
<li><a href="/siarte/tag:%EC%98%A4%EB%8A%98%EC%9D%98%EC%82%BD%EC%A7%88" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">오늘의삽질</span></a></li></ul></li>

<li><p>인스턴스 관리</p>
<ul><li><a href="/siarte/tag:%EC%86%8D%EC%82%AD%EC%9E%84%EC%9D%B4%EA%B3%A0%EC%9D%B4%EB%8A%94%EB%B3%84" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">속삭임이고이는별</span></a></li>
<li><a href="/siarte/tag:%EC%9E%83%EC%96%B4%EB%B2%84%EB%A6%B0%EC%84%AC" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">잃어버린섬</span></a></li>
<li><a href="/siarte/tag:%EA%BF%88%EA%BE%B8%EB%8A%94%EC%96%B4%EB%A6%B0%EC%9A%A9" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">꿈꾸는어린용</span></a></li></ul></li>

<li><p>서버를 만지거나 컴퓨터를 만지거나</p>
<ul><li><a href="/siarte/tag:%EC%82%90%EC%82%90%EC%80%BC%EC%80%BC" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">삐삐쀼쀼</span></a>
<ul><li><a href="/siarte/tag:mastodon" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">mastodon</span></a></li>
<li><a href="/siarte/tag:writefreely" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">writefreely</span></a></li>
<li><a href="/siarte/tag:matrix" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">matrix</span></a></li></ul></li></ul></li>

<li><p>그 외</p>
<ul><li><a href="/siarte/tag:%EC%BB%A4%EB%AF%B8%EC%85%98" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">커미션</span></a></li>
<li><a href="/siarte/tag:Vtube%EC%9C%A4%EB%AF%B8%EB%A5%B4" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Vtube윤미르</span></a></li></ul></li></ul>
]]></content:encoded>
      <guid>https://blog.daydream.ink/siarte/tags</guid>
      <pubDate>Wed, 21 Aug 2024 19:46:52 +0900</pubDate>
    </item>
    <item>
      <title>matrix에 텔레그램 브릿지 붙이기</title>
      <link>https://blog.daydream.ink/siarte/matrixe-telregeuraem-beurisji-butigi</link>
      <description>&lt;![CDATA[1. 브릿지란?&#xA;저도 모릅니다. 이거 연결하면 텔레그램에 있는 메세지를 전부 matrix로 받아볼 수 있는 것만 알아요. 움직이는 거 보니까 일종의 외부 접속 어플리케이션으로 인식하는 거 같더라고요.&#xA;&#xA;2. 사용하려면?&#xA;일단 matrix-telegram 사이를 연결해주는 브릿지 서버(깃헙)를 올리던가 남이 만들어둔 브릿지 봇을 써야합니다.&#xA;남이 만들어둔 브릿지 봇은 여기서 참고(링크)&#xA;&#xA;3. 브릿지 서버를 올려보아요.&#xA;저는 브릿지 서버를 올리는 방법을 기록할 거예요. 공식 가이드(설치, 도커)참고하면 되는데 이거 진짜 설정 복잡합니다.&#xA;&#xA;이게 깃헙에 올라가있는 예시 링크인데 길이 보세요. (링크)&#xA;&#xA;차근차근 갑시다.&#xA;도커 컴포즈 기준이에요.&#xA;homeserver:&#xA;    address: [https://실제 서비스 주소]&#xA;    domain: [핸들 주소]&#xA;    verifyssl: true&#xA;    httpretrycont: 4&#xA;    statusendpoint: [비워두세요]&#xA;    messagesendcheckpointendpoint: [비워두세요]&#xA;    asyncmedia: false&#xA;&#xA;대부분의 값은 디폴트 값으로 뒀으니 주석 참고하세요.&#xA;&#xA;appservice:&#xA;    address: [http://도커로 올린 브릿지 서버 이름:29317]&#xA;    tlscert: false&#xA;    tlskey: false&#xA;&#xA;    hostname: 0.0.0.0&#xA;    port: 29317&#xA;    maxbodysize: 1&#xA;&#xA;    public:&#xA;        enabled: false&#xA;        prefix: /public&#xA;        external: [http://실제 서비스 주소/public]&#xA;&#xA;    provisioning:&#xA;        enabled: true&#xA;        prefix: /matrix/provision&#xA;        sharedsecret: [자동생성]&#xA;&#xA;    id: telegram&#xA;    botusername: telegrambot&#xA;    botdisplayname: Telegram bridge bot&#xA;    botavatar: mxc://maunium.net/tJCRmUyJDsgRNgqhOgoiHWbX&#xA;&#xA;    ephemeralevents: true&#xA;&#xA;    astoken: [자동생성]&#xA;    hstoken: [자동생성]&#xA;&#xA;metrics, manhole 설정은 건드리지 않았습니다.&#xA;&#xA;bridge:&#xA;&#xA;    ...&#xA;&#xA;    doublepuppetservermap:&#xA;        [핸들 주소]: [https://실제 서비스 주소]&#xA;    doublepuppetallowdiscovery: false&#xA;    loginsharedsecretmap:&#xA;        [핸들 주소]: astoken:[자유 랜덤 문자열]&#xA;double puppeting은 주석에도 설명이 있지만, 텔레그램에서 올라온 내 글과 매트릭스에서 올라온 내 글을 모두 볼 수 있게 해주는 거예요.&#xA;그 뒷부분도 저는 기존 예시대로 유지했습니다.&#xA;&#xA;그 다음으로 중요한 부분은 bridge안에 있는 encryption 설정입니다.&#xA;    ...&#xA;&#xA;    permissions:&#xA;        [유저/서버]: [권한]&#xA;유저/서버&#xA;    &#39;&#39; : 모든 매트릭스 유저&#xA;    &#39;도메인&#39;: 특정 서버의 모든 유저&#xA;    &#39;유저 핸들&#39;: 사용할 수 있는 유저&#xA;&#xA;권한&#xA;    &#39;relaybot&#39;: 커맨드는 사용할 수 없고 브릿지 연결로만 사용할 수 있는 권한&#xA;    &#39;user&#39;: relaybot 권한에 브릿지를 만들 수 있는 접속 명령 사용 가능&#xA;    &#39;puppeting&#39;: user 권한에 텔레그램 계정에 로그인 할 수 있는 권한&#xA;    &#39;full&#39;: 브릿지 봇의 모든 권한 사용 가능. matrix 로그인 가능&#xA;    &#39;admin&#39;: 브릿지 봇의 모든 권한 및 관리 명령어 사용 가능&#xA;&#xA;써두긴 했는데 정확한 건 설정 예시 참조해주세요.&#xA;&#xA;    relaybot:&#xA;&#xA;        ...&#xA;&#xA;        whitelist:&#xA;        [유저명]&#xA;봇 명령을 사용할 수 있는 유저 목록&#xA;&#xA;telegram:&#xA;    apiid: [https://my.telegram.org/apps에서 얻은 apiid]&#xA;    apihash: [https://my.telegram.org/apps에서 얻은 apihash]&#xA;    bottoken: [https://t.me/BotFather를 통해 얻은 봇 토큰]&#xA;&#xA;   ...&#xA;&#xA;    deviceinfo:&#xA;        devicemodel: [도커 컴포즈에서 설정한 브릿지 서버 이름]&#xA;&#xA; 경고&#xA;이 바로 아래 있는&#xA;    server:&#xA;        enabled: false&#xA;는 반드시 false로 유지해야합니다. 한 번이라도 true로 바꾸면 데이터베이스를 갈아엎어야해요. 저는 데이터베이스 필요없다는 걸 깨닫고 해제해서 해결함.&#xA;&#xA;4. 이제는 matrix 서버에 연결할 차례&#xA;여기까지 진행했으면 브릿지 서버에는 큰 문제가 없을 거예요.&#xA;&#xA;그 다음은 homeserver.yaml입니다.&#xA;&#xA;appserviceconfigfiles:&#xA;    /data/matrix-telegram/registration.yaml&#xA;    /data/matrix-telegram/doublepuppet.yaml&#xA;&#xA;일단 여기에 이렇게 설정을 추가해주고, registration.yaml은 자동으로 생기는 거니 건드리지 않으면 됩니다. doublepuppet.yaml은 이 페이지를 참고해주세요.&#xA;&#xA;id: doublepuppet&#xA;url:&#xA;astoken: [아래 설명]&#xA;hstoken: [안 쓰이는 거니까 아무거나 넣으세요]&#xA;senderlocalpart: [적당히 아무거나]&#xA;ratelimited: false&#xA;namespaces:&#xA;  users:&#xA;  regex: &#39;@.*:내\.도메인&#39;&#xA;    exclusive: false&#xA;astoken은 bridge 설정 안에 있는&#xA;    loginsharedsecretmap:&#xA;        [핸들 주소]: astoken:[자유 랜덤 문자열]&#xA;의 as_token 뒤의 문자열을 넣으면 됩니다.&#xA;&#xA;5. 끝!&#xA;정보가 부족한 부분이 있거나 잘못된 부분이 있으면 mastodon로 연락주세요.&#xA;&#xA;/br&#xA;&#xA;#matrix  #삐삐쀼쀼&#xA;&#xA;div class=&#34;link-and-banner&#34;&#xD;&#xA;h1배너/h1&#xD;&#xA;&#xD;&#xA;pimg src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/p&#xD;&#xA;p class=&#34;banner-code&#34;textareaa href=&#34;https://blog.daydream.ink/siarte&#34;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/a/textarea/p&#xD;&#xA;/div]]&gt;</description>
      <content:encoded><![CDATA[<h3 id="1-브릿지란" id="1-브릿지란">1. 브릿지란?</h3>

<p>저도 모릅니다. 이거 연결하면 텔레그램에 있는 메세지를 전부 matrix로 받아볼 수 있는 것만 알아요. 움직이는 거 보니까 일종의 외부 접속 어플리케이션으로 인식하는 거 같더라고요.</p>

<h3 id="2-사용하려면" id="2-사용하려면">2. 사용하려면?</h3>

<p>일단 matrix-telegram 사이를 연결해주는 브릿지 서버(<a href="https://github.com/mautrix/telegram" rel="nofollow">깃헙</a>)를 올리던가 남이 만들어둔 브릿지 봇을 써야합니다.
남이 만들어둔 브릿지 봇은 여기서 참고(<a href="https://docs.mau.fi/bridges/python/telegram/index.html" rel="nofollow">링크</a>)</p>

<h3 id="3-브릿지-서버를-올려보아요" id="3-브릿지-서버를-올려보아요">3. 브릿지 서버를 올려보아요.</h3>

<p>저는 브릿지 서버를 올리는 방법을 기록할 거예요. 공식 가이드(<a href="https://docs.mau.fi/bridges/python/setup.html?bridge=telegram" rel="nofollow">설치</a>, <a href="https://docs.mau.fi/bridges/general/docker-setup.html?bridge=telegram" rel="nofollow">도커</a>)참고하면 되는데 이거 진짜 설정 복잡합니다.</p>

<p>이게 깃헙에 올라가있는 예시 링크인데 길이 보세요. (<a href="https://github.com/mautrix/telegram/blob/master/mautrix_telegram/example-config.yaml" rel="nofollow">링크</a>)</p>

<p>차근차근 갑시다.
도커 컴포즈 기준이에요.</p>

<pre><code>homeserver:
    address: [https://실제 서비스 주소]
    domain: [핸들 주소]
    verify_ssl: true
    http_retry_cont: 4
    status_endpoint: [비워두세요]
    message_send_checkpoint_endpoint: [비워두세요]
    async_media: false
</code></pre>

<p>대부분의 값은 디폴트 값으로 뒀으니 주석 참고하세요.</p>

<pre><code>appservice:
    address: [http://도커로 올린 브릿지 서버 이름:29317]
    tls_cert: false
    tls_key: false

    hostname: 0.0.0.0
    port: 29317
    max_body_size: 1

    public:
        enabled: false
        prefix: /public
        external: [http://실제 서비스 주소/public]

    provisioning:
        enabled: true
        prefix: /_matrix/provision
        shared_secret: [자동생성]

    id: telegram
    bot_username: telegrambot
    bot_displayname: Telegram bridge bot
    bot_avatar: mxc://maunium.net/tJCRmUyJDsgRNgqhOgoiHWbX

    ephemeral_events: true

    as_token: [자동생성]
    hs_token: [자동생성]
</code></pre>

<p>metrics, manhole 설정은 건드리지 않았습니다.</p>

<pre><code>bridge:

    ...

    double_puppet_server_map:
        [핸들 주소]: [https://실제 서비스 주소]
    double_puppet_allow_discovery: false
    login_shared_secret_map:
        [핸들 주소]: as_token:[자유 랜덤 문자열]
</code></pre>

<p>double puppeting은 주석에도 설명이 있지만, 텔레그램에서 올라온 내 글과 매트릭스에서 올라온 내 글을 모두 볼 수 있게 해주는 거예요.
그 뒷부분도 저는 기존 예시대로 유지했습니다.</p>

<p>그 다음으로 중요한 부분은 bridge안에 있는 encryption 설정입니다.</p>

<pre><code>    ...

    permissions:
        [유저/서버]: [권한]
</code></pre>

<p>유저/서버
    &#39;*&#39; : 모든 매트릭스 유저
    &#39;도메인&#39;: 특정 서버의 모든 유저
    &#39;유저 핸들&#39;: 사용할 수 있는 유저</p>

<p>권한
    &#39;relaybot&#39;: 커맨드는 사용할 수 없고 브릿지 연결로만 사용할 수 있는 권한
    &#39;user&#39;: relaybot 권한에 브릿지를 만들 수 있는 접속 명령 사용 가능
    &#39;puppeting&#39;: user 권한에 텔레그램 계정에 로그인 할 수 있는 권한
    &#39;full&#39;: 브릿지 봇의 모든 권한 사용 가능. matrix 로그인 가능
    &#39;admin&#39;: 브릿지 봇의 모든 권한 및 관리 명령어 사용 가능</p>

<p>써두긴 했는데 정확한 건 설정 예시 참조해주세요.</p>

<pre><code>    relaybot:

        ...

        whitelist:
        - [유저명]
</code></pre>

<p>봇 명령을 사용할 수 있는 유저 목록</p>

<pre><code>telegram:
    api_id: [https://my.telegram.org/apps에서 얻은 api_id]
    api_hash: [https://my.telegram.org/apps에서 얻은 api_hash]
    bot_token: [https://t.me/BotFather를 통해 얻은 봇 토큰]

   ...

    device_info:
        device_model: [도커 컴포즈에서 설정한 브릿지 서버 이름]
</code></pre>

<p><strong>* 경고</strong>
이 바로 아래 있는</p>

<pre><code>    server:
        enabled: false
</code></pre>

<p>는 반드시 false로 유지해야합니다. 한 번이라도 true로 바꾸면 데이터베이스를 갈아엎어야해요. 저는 데이터베이스 필요없다는 걸 깨닫고 해제해서 해결함.</p>

<h3 id="4-이제는-matrix-서버에-연결할-차례" id="4-이제는-matrix-서버에-연결할-차례">4. 이제는 matrix 서버에 연결할 차례</h3>

<p>여기까지 진행했으면 브릿지 서버에는 큰 문제가 없을 거예요.</p>

<p>그 다음은 <code>homeserver.yaml</code>입니다.</p>

<pre><code>app_service_config_files:
    - /data/matrix-telegram/registration.yaml
    - /data/matrix-telegram/doublepuppet.yaml
</code></pre>

<p>일단 여기에 이렇게 설정을 추가해주고, <code>registration.yaml</code>은 자동으로 생기는 거니 건드리지 않으면 됩니다. <code>doublepuppet.yaml</code>은 <a href="https://docs.mau.fi/bridges/general/double-puppeting.html" rel="nofollow">이 페이지</a>를 참고해주세요.</p>

<pre><code>id: doublepuppet
url:
as_token: [아래 설명]
hs_token: [안 쓰이는 거니까 아무거나 넣으세요]
sender_localpart: [적당히 아무거나]
rate_limited: false
namespaces:
  users:
  - regex: &#39;@.*:내\.도메인&#39;
    exclusive: false
</code></pre>

<p>as_token은 bridge 설정 안에 있는</p>

<pre><code>    login_shared_secret_map:
        [핸들 주소]: as_token:[자유 랜덤 문자열]
</code></pre>

<p>의 as_token 뒤의 문자열을 넣으면 됩니다.</p>

<h3 id="5-끝" id="5-끝">5. 끝!</h3>

<p>정보가 부족한 부분이 있거나 잘못된 부분이 있으면 <a href="https://daydream.ink/@siarte" rel="nofollow">mastodon</a>로 연락주세요.</p>

<p></br></p>

<p><a href="/siarte/tag:matrix" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">matrix</span></a>  <a href="/siarte/tag:%EC%82%90%EC%82%90%EC%80%BC%EC%80%BC" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">삐삐쀼쀼</span></a></p>

<div class="link-and-banner">
<h1>배너</h1>

<p><img src="https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp"></p>
<p class="banner-code">&lt;a href=&#34;https://blog.daydream.ink/siarte&#34;&gt;&lt;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;&gt;&lt;/a&gt;</p>
</div>
]]></content:encoded>
      <guid>https://blog.daydream.ink/siarte/matrixe-telregeuraem-beurisji-butigi</guid>
      <pubDate>Tue, 20 Aug 2024 16:01:24 +0900</pubDate>
    </item>
    <item>
      <title>matrix 서버에 마스토돈 로그인 추가하기</title>
      <link>https://blog.daydream.ink/siarte/matrix-seobeoe-maseutodon-rogeuin-cugahagi</link>
      <description>&lt;![CDATA[공식 가이드대로 하면 됩니다.&#xA;...만, 주의사항.&#xA;&#xA;공식 가이드에서 제공하는 설정에는 함정이 있습니다.&#xA;&#xA;localparttemplate: &#34;{{ user.username }}&#xA;&#xA;이 설정은 마스토돈 유저의 핸들을 그대로 활용하여 로그인하게 하는 방법입니다. 여기서 문제가 생기는 게 무어냐, oidc를 활용한 가입을 열어두었을 경우 같은 아이디가 있으면 자동으로 id 뒤에 숫자가 붙어 중복 가입을 시켜버립니다.&#xA;반대로 oidc를 활용한 가입을 닫아두었을 경우 로그인이 불가합니다. allowexistingusers 옵션을 켜두었을 경우 같은 아이디를 가진 유저로 바로 로그인이 됩니다. 즉, 다른 유저로 인증 없이 로그인이 가능합니다.&#xA;&#xA;그래서 localparttemplate를 없애보았는데 이번엔 비밀번호로 이미 가입한 계정에 연동하는 게 안 되더라고요. 덕분에 비밀번호 가입과 oidc를 동시 연동하겠다는 꿈이 깨졌습니다... ㅇㅠ...&#xA;&#xA;p style=&#34;color: gray;&#34;만져보니 db를 직접 건드리거나 이리저리 꼼수를 쓰면 어떻게 가능할 것 같긴 한데 추천하진 않습니다./p&#xA;&#xA;/br&#xA;결론: 비밀번호 가입과 마스토돈 가입을 동시에 열어두면 로그인이 꼬인다.&#xA;&#xA;/br&#xA;p style=&#34;color: gray;&#34;참고로 a href=&#34;https://matrix-org.github.io/synapse/latest/usage/configuration/configdocumentation.html&#34;기본 메뉴얼/a에도 있는 정보지만 enable_registration를 켜두면 비밀번호 가입과 별도로 해당 oidc로 회원가입 여부를 결정할 수 있습니다./p&#xA;&#xA;#matrix #삐삐쀼쀼&#xA;&#xA;div class=&#34;link-and-banner&#34;&#xD;&#xA;h1배너/h1&#xD;&#xA;&#xD;&#xA;pimg src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/p&#xD;&#xA;p class=&#34;banner-code&#34;textareaa href=&#34;https://blog.daydream.ink/siarte&#34;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/a/textarea/p&#xD;&#xA;/div]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://matrix-org.github.io/synapse/latest/openid.html" rel="nofollow">공식 가이드</a>대로 하면 됩니다.
...만, 주의사항.</p>

<p>공식 가이드에서 제공하는 설정에는 함정이 있습니다.</p>

<p><code>localpart_template: &#34;{{ user.username }}</code></p>

<p>이 설정은 마스토돈 유저의 핸들을 그대로 활용하여 로그인하게 하는 방법입니다. 여기서 문제가 생기는 게 무어냐, <strong>oidc를 활용한 가입을 열어두었을 경우</strong> 같은 아이디가 있으면 자동으로 id 뒤에 숫자가 붙어 중복 가입을 시켜버립니다.
반대로 <strong>oidc를 활용한 가입을 닫아두었을 경우</strong> 로그인이 불가합니다. <code>allow_existing_users</code> 옵션을 켜두었을 경우 같은 아이디를 가진 유저로 바로 로그인이 됩니다. 즉, 다른 유저로 인증 없이 로그인이 가능합니다.</p>

<p>그래서 <code>localpart_template</code>를 없애보았는데 이번엔 비밀번호로 이미 가입한 계정에 연동하는 게 안 되더라고요. 덕분에 비밀번호 가입과 oidc를 동시 연동하겠다는 꿈이 깨졌습니다... ㅇ_ㅠ...</p>

<p style="color: gray;">만져보니 db를 직접 건드리거나 이리저리 꼼수를 쓰면 어떻게 가능할 것 같긴 한데 추천하진 않습니다.</p>

<p></br>
결론: 비밀번호 가입과 마스토돈 가입을 동시에 열어두면 로그인이 꼬인다.</p>

<p></br>
<p style="color: gray;">참고로 <a href="https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html" rel="nofollow">기본 메뉴얼</a>에도 있는 정보지만 <code>enable_registration</code>를 켜두면 비밀번호 가입과 별도로 해당 oidc로 회원가입 여부를 결정할 수 있습니다.</p></p>

<p><a href="/siarte/tag:matrix" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">matrix</span></a> <a href="/siarte/tag:%EC%82%90%EC%82%90%EC%80%BC%EC%80%BC" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">삐삐쀼쀼</span></a></p>

<div class="link-and-banner">
<h1>배너</h1>

<p><img src="https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp"></p>
<p class="banner-code">&lt;a href=&#34;https://blog.daydream.ink/siarte&#34;&gt;&lt;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;&gt;&lt;/a&gt;</p>
</div>
]]></content:encoded>
      <guid>https://blog.daydream.ink/siarte/matrix-seobeoe-maseutodon-rogeuin-cugahagi</guid>
      <pubDate>Sun, 18 Aug 2024 12:57:05 +0900</pubDate>
    </item>
    <item>
      <title>docker로 TURN서버 올려서 matrix 서버에서 음성, 화상 채팅 기능 활성화하기</title>
      <link>https://blog.daydream.ink/siarte/dockerro-turnseobeo-olryeoseo-matrix-seobeoeseo-eumseong-hwasang-caeting-gineung</link>
      <description>&lt;![CDATA[matrix 클라이언트에서 보면 음성, 화상 채팅 기능이 있다. 그런데 서버를 올리고 보니 기능이 없어서 그게 안 되더라. 알아보니 VoIP를 통해 통신을 해야하고 그걸 해주는 TURN 서버를 붙여야한다고... &#xA;&#xA;해서, 붙여봤습니다.&#xA;&#xA;공식 가이드&#xA;&#xA;TURN 서버는 coturn으로 올렸습니다. 공식 가이드에 따르면 apt로 설치해서 돌리는 건데 저는 굳이 docker로 올렸어요. 다행히 coturn 공식에서 제공하는 docker compose 문서가 친절해서 금방 설치할 수 있었습니다.&#xA;&#xA;위 docker-compose.yml 문서와 관련한 주의점.&#xA;&#xA;postgres로 되어있지만 DB는 필요 없었어요.&#xA;80, 443 포트는 삭제해주세요.&#xA;문서에 적혀있는 포트는 다 개방해줘야합니다.&#xA;&#xA;마지막으로 turnserver.conf는 coturn에서 제공하는 공식 예시와 matrix에서 제공하는 안내 문서가 있습니다. 저는 cotrun에서 제공하는 공식 예시를 보고 작성했어요.&#xA;&#xA;/br&#xA;turnserver.conf&#xA;&#xA;listening-port=3478&#xA;tls-listening-port=5349&#xA;여기까진 기본 설정입니다.&#xA;&#xA;listening-ip=&#xA;external-ip=[서버 아이피]&#xA;listening-ip는 비워두면 모든 ip에서 수신합니다.&#xA;external-ip는 서버 외부 ip예요. 이쪽으로 오면 된다고 알려주는 겁니다.&#xA;&#xA;static-auth-secret=[비밀 키]&#xA;server-name=[TURN 서버명]&#xA;realm=[TURN 서버 도메인]&#xA;여기는 써있는대로.&#xA;&#xA;cert=[cert.pem 경로]&#xA;pkey=[private key 경로]&#xA;이건 openssl로 만들었어요.&#xA;openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem&#xA;&#xA;syslog&#xA;simple-log&#xA;로그 설정. 저는 file에다 지정했는데 바꾸려고요.&#xA;&#xA;나머지는 matrix 문서에서 하라는 대로 하면 됩니다. 저는 coturn 문서 보고 하는 바람에 오히려 헷갈린 게 많긴 했어요. 워낙 옵션이 많아서...&#xA;&#xA;/br&#xA;homeserver.yaml&#xA;&#xA;turnuris: [ &#34;turn:[TURN 서버 도메인]?transport=udp&#34;, &#34;turn:[TURN 서버 도메인]?transport=tcp&#34; ]&#xA;turnsharedsecret: &#34;turnserver.conf에서 static-auth-secret에 넣은 비밀 키&#34;&#xA;turnuserlifetime: 86400000&#xA;turnallow_guests: true&#xA;이건 사실 matrix 공식 가이드대로 하기만 하면 돼서 쓰기 뭐한데... 그렇습니다.&#xA;&#xA;이거면 설정 끝!&#xA;자료도 많고 가이드도 잘 되어있어서 꽤 쉬웠어요. 오히려 자료가 너무 많아서 좀 헤맸습니다. turnserver.conf 설정은 matrix 가이드 따라하세요. 저처럼 coturn 설정 보고 다 챙기려다 실패하지 말고.&#xA;&#xA;#matrix #삐삐쀼쀼&#xA;&#xA;div class=&#34;link-and-banner&#34;&#xD;&#xA;h1배너/h1&#xD;&#xA;&#xD;&#xA;pimg src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/p&#xD;&#xA;p class=&#34;banner-code&#34;textareaa href=&#34;https://blog.daydream.ink/siarte&#34;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/a/textarea/p&#xD;&#xA;/div]]&gt;</description>
      <content:encoded><![CDATA[<p>matrix 클라이언트에서 보면 음성, 화상 채팅 기능이 있다. 그런데 서버를 올리고 보니 기능이 없어서 그게 안 되더라. 알아보니 VoIP를 통해 통신을 해야하고 그걸 해주는 TURN 서버를 붙여야한다고...</p>

<p>해서, 붙여봤습니다.</p>

<p><a href="https://matrix-org.github.io/synapse/latest/turn-howto.html" rel="nofollow">공식 가이드</a></p>

<p>TURN 서버는 <a href="https://github.com/coturn/coturn" rel="nofollow">coturn</a>으로 올렸습니다. <a href="https://matrix-org.github.io/synapse/latest/setup/turn/coturn.html" rel="nofollow">공식 가이드</a>에 따르면 apt로 설치해서 돌리는 건데 저는 굳이 docker로 올렸어요. 다행히 <a href="https://github.com/coturn/coturn/blob/master/docker/docker-compose-postgresql.yml" rel="nofollow">coturn 공식에서 제공하는 docker compose 문서</a>가 친절해서 금방 설치할 수 있었습니다.</p>

<p>위 docker-compose.yml 문서와 관련한 주의점.</p>
<ul><li>postgres로 되어있지만 DB는 필요 없었어요.</li>
<li>80, 443 포트는 삭제해주세요.</li>
<li>문서에 적혀있는 포트는 다 개방해줘야합니다.</li></ul>

<p>마지막으로 turnserver.conf는 <a href="https://github.com/coturn/coturn/blob/master/examples/etc/turnserver.conf" rel="nofollow">coturn에서 제공하는 공식 예시</a>와 <a href="https://matrix-org.github.io/synapse/latest/setup/turn/coturn.html" rel="nofollow">matrix에서 제공하는 안내 문서</a>가 있습니다. 저는 cotrun에서 제공하는 공식 예시를 보고 작성했어요.</p>

<p></br></p>

<h3 id="turnserver-conf" id="turnserver-conf">turnserver.conf</h3>

<pre><code>listening-port=3478
tls-listening-port=5349
</code></pre>

<p>여기까진 기본 설정입니다.</p>

<pre><code>listening-ip=
external-ip=[서버 아이피]
</code></pre>

<p>listening-ip는 비워두면 모든 ip에서 수신합니다.
external-ip는 서버 외부 ip예요. 이쪽으로 오면 된다고 알려주는 겁니다.</p>

<pre><code>static-auth-secret=[비밀 키]
server-name=[TURN 서버명]
realm=[TURN 서버 도메인]
</code></pre>

<p>여기는 써있는대로.</p>

<pre><code>cert=[cert.pem 경로]
pkey=[private key 경로]
</code></pre>

<p>이건 openssl로 만들었어요.
<code>openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem</code></p>

<pre><code>syslog
simple-log
</code></pre>

<p>로그 설정. 저는 file에다 지정했는데 바꾸려고요.</p>

<p>나머지는 matrix 문서에서 하라는 대로 하면 됩니다. 저는 coturn 문서 보고 하는 바람에 오히려 헷갈린 게 많긴 했어요. 워낙 옵션이 많아서...</p>

<p></br></p>

<h3 id="homeserver-yaml" id="homeserver-yaml">homeserver.yaml</h3>

<pre><code>turn_uris: [ &#34;turn:[TURN 서버 도메인]?transport=udp&#34;, &#34;turn:[TURN 서버 도메인]?transport=tcp&#34; ]
turn_shared_secret: &#34;turnserver.conf에서 static-auth-secret에 넣은 비밀 키&#34;
turn_user_lifetime: 86400000
turn_allow_guests: true
</code></pre>

<p>이건 사실 matrix 공식 가이드대로 하기만 하면 돼서 쓰기 뭐한데... 그렇습니다.</p>

<p>이거면 설정 끝!
자료도 많고 가이드도 잘 되어있어서 꽤 쉬웠어요. 오히려 자료가 너무 많아서 좀 헤맸습니다. turnserver.conf 설정은 matrix 가이드 따라하세요. 저처럼 coturn 설정 보고 다 챙기려다 실패하지 말고.</p>

<p><a href="/siarte/tag:matrix" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">matrix</span></a> <a href="/siarte/tag:%EC%82%90%EC%82%90%EC%80%BC%EC%80%BC" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">삐삐쀼쀼</span></a></p>

<div class="link-and-banner">
<h1>배너</h1>

<p><img src="https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp"></p>
<p class="banner-code">&lt;a href=&#34;https://blog.daydream.ink/siarte&#34;&gt;&lt;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;&gt;&lt;/a&gt;</p>
</div>
]]></content:encoded>
      <guid>https://blog.daydream.ink/siarte/dockerro-turnseobeo-olryeoseo-matrix-seobeoeseo-eumseong-hwasang-caeting-gineung</guid>
      <pubDate>Sat, 17 Aug 2024 20:45:17 +0900</pubDate>
    </item>
    <item>
      <title>docker를 이용해 matrix(연합 채팅 프로토콜) 서버 올리기</title>
      <link>https://blog.daydream.ink/siarte/dockerreul-iyonghae-matrix-yeonhab-caeting-peurotokol-seobeo-olrigi</link>
      <description>&lt;![CDATA[준비물&#xA;서버를 올릴 컴퓨팅 자원&#xA;&#xA;필요한 프로그램&#xA;docker와 docker compose&#xA;nginx&#xA;문서 편집기&#xA;&#xA;1. docker-compose.yml 만들기&#xA;&#xA;원하는 경로에 matrix 폴더를 만들고 그 안에 docker-compose.yml을 만들어 다음 내용을 작성한다.&#xA;폴더는 따로 안 만들어도 동작 하지만 나는 matrix용 폴더를 만들고 그 안에 docker 볼륨이 들어갈 폴더를 만들었다.&#xA;&#xA;services:&#xA;  synapse:&#xA;    image: matrixdotorg/synapse&#xA;    restart: always&#xA;    ports:&#xA;      8008:8008&#xA;    volumes:&#xA;      [볼륨을 물릴 경로]:/data&#xA;&#xA;2. 도메인 물려서 서버 동작시키기&#xA;&#xA;docker run -it --rm -v [볼륨을 물릴 경로]:/data -e SYNAPSESERVERNAME=[서버를 돌릴 도메인 주소] -e SYNAPSEREPORTSTATS=yes matrixdotorg/synapse:latest generate&#xA;동작시키면 [볼륨을 물릴 경로]에 homeserver.yaml 파일이 생긴다. 이 파일에서 가입을 열고 다른 설정을 할 수 있다.&#xA;&#xA;위 명령어가 잘 동작했다면 서버의 8008 포트에 접속해본다.&#xA;&#xA;매트릭스 서버가 성공적으로 올라갔을 때 뜨는 웹화면&#xA;위와 같은 화면이 뜨면 성공적으로 올라간 것이다.&#xA;&#xA;3. nginx에 서버 물려서 서비스하기&#xA;nginx는 설치되어 있다는 가정 하에,  /etc/nginx/sites-available/ 경로에 매트릭스를 위한 config파일을 하나 만든다. 파일명은 알아만 볼 수 있으면 된다.&#xA;&#xA;기본적인 내용은 다음과 같다&#xA;&#xA;server {&#xA;&#xA;        servername [서버를 돌릴 도메인 주소];&#xA;&#xA;        location ~ ^(/matrix|/synapse/client) {&#xA;                proxypass http://localhost:8008;&#xA;                proxysetheader X-Forwarded-For $remoteaddr;&#xA;                proxysetheader X-Forwarded-Proto $scheme;&#xA;                proxysetheader Host $host;&#xA;&#xA;                clientmaxbodysize 50M;&#xA;                proxyhttpversion 1.1;&#xA;        }&#xA;}&#xA;&#xA;위 내용으로 config 파일을 만들었다면&#xA;&#xA;ln -s /etc/nginx/sites-available/[설정파일명] /etc/nginx/sites-enabled/[설정파일명]&#xA;을 수행한 후 nginx -t 명령으로 설정에 문제가 없는지 확인한다.&#xA;&#xA;systemctl restart nginx nginx를 재시작한다.&#xA;&#xA;nginx가 제대로 돌아가려면 방화벽에서 80번 포트와 443 포트가 열려있어야 한다. 그걸 위해 아래 명령을 수행하거나 또는 다른 툴을 이용해 방화벽을 열어준다.&#xA;&#xA;4. 인증서 발급&#xA;&#xA;certbot을 이용해 인증서를 발급받는다. 이 과정 설명은 생략한다.&#xA;&#xA;인증서를 발급받으면 방금 설정한 nginx 설정 아래쪽에 listen 443 ssl; # managed by Certbot로 시작하는 코드가 몇 줄 생겼을 것이다. 그 위에 listen 8448 ssl;를 추가해준다.&#xA;&#xA;기존의 location과 listen ... 사이에 다음 코드를 추가해준다.&#xA;&#xA;        location /.well-known/matrix/client {&#xA;                return 200 &#39;{&#34;m.server&#34;: {&#34;baseurl&#34;: &#34;[서비스할 도메인 주소]:443&#34;}}&#39;;&#xA;                defaulttype application/json;&#xA;                addheader Access-Control-Allow-Origin ;&#xA;        }&#xA;        &#xA;        location /.well-known/matrix/server {&#xA;                defaulttype application/json;&#xA;                addheader Access-Control-Allow-Origin ;&#xA;                return 200 &#39;{&#34;m.server&#34;:&#34;[서비스할 도메인 주소]:443&#34;}&#39;;&#xA;        }&#xA;&#xA;3.5 만약 실제 서비스는 서브 도메인으로, 계정 핸들은 메인 도메인으로 사용하고 싶다면&#xA;&#xA;바로 위의 /.well-known/... 설정은 메인 도메인 nginx 설정에 넣어준다. 코드 내부에 넣을 주소는 실제 서비스가 돌아가고 있는 서브도메인 주소를 넣으면 된다.&#xA;&#xA; [볼륨을 물릴 경로] 내부의 파일을 다 지운다. 그 후 docker compose down을 이용해 서버를 내리고&#xA;&#xA;docker run -it --rm -v [볼륨을 물릴 경로]:/data -e SYNAPSESERVERNAME=[핸들로 사용할 도메인] -e SYNAPSEREPORTSTATS=yes matrixdotorg/synapse:latest generate&#xA;&#xA;위 명령어를 실행한다.&#xA;&#xA;4. 가입 열기&#xA;&#xA;[볼륨을 물릴 경로]/homeserver.yaml을 열어 enableregistration: true를 추가한다.&#xA;&#xA;이후 docker compose를 올리면 되는데...&#xA;내가 해봤을 때 뭔가 설정을 추가해달라는 요구가 뜨며 오류가 났었다. 정확히 무슨 옵션을 추가하라고 했었는지는 기억이 나지 않으니  docker compose up 명령어를 이용해 직접 확인해서 추가하면 된다. 모든 옵션 설정이 끝나면&#xA;&#xA;로 서버를 백그라운드에 올려서 완료.&#xA;&#xA;5. 오브젝트 스토리지&#xA;&#xA;여기서 끝인 줄 알았는데 object storage를 연결해야한다는 걸 알게됐다. 버킷 없이 관리할 수도 있지만 자신이 없어서 물려놓기로 했다. 문제는 직접 설치한 게 아니라 도커로 서버를 올렸다는 것.&#xA;&#xA;직접 설치했을 경우 matrix.org에서 제공하는 synapse-s3-storage-provider를 이용할 수 있으나 도커로 올리면 방법이 없다.&#xA;&#xA;검색을 반복한 끝에 [볼륨을 물릴 경로]/mediastore에 rclone으로 오브젝트 스토리지를 mount 하기로 했다. 각자의 object storage의 특성에 맞춰 mount해서 사용하면 된다. mediastore는 기본 설정이므로 homeserver.yaml파일에서 설정을 바꿀 수 있다.&#xA;&#xA;6. 도움이 되는 사이트&#xA;matrix 연합 테스터&#xA;&#xA;7. 참조&#xA;https://theselfhostingblog.com/posts/self-hosting-your-own-matrix-server-on-a-raspberry-pi/&#xA;https://matrix-org.github.io/synapse/latest/&#xA;&#xA;#matrix #삐삐쀼쀼&#xA;&#xA;div class=&#34;link-and-banner&#34;&#xD;&#xA;h1배너/h1&#xD;&#xA;&#xD;&#xA;pimg src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/p&#xD;&#xA;p class=&#34;banner-code&#34;textareaa href=&#34;https://blog.daydream.ink/siarte&#34;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/a/textarea/p&#xD;&#xA;/div]]&gt;</description>
      <content:encoded><![CDATA[<h3 id="준비물">준비물</h3>
<ul><li>서버를 올릴 컴퓨팅 자원</li></ul>

<h3 id="필요한-프로그램" id="필요한-프로그램">필요한 프로그램</h3>
<ul><li>docker와 docker compose</li>
<li>nginx</li>
<li>문서 편집기</li></ul>

<h3 id="1-docker-compose-yml-만들기" id="1-docker-compose-yml-만들기">1. docker-compose.yml 만들기</h3>

<p>원하는 경로에 matrix 폴더를 만들고 그 안에 docker-compose.yml을 만들어 다음 내용을 작성한다.
폴더는 따로 안 만들어도 동작 하지만 나는 matrix용 폴더를 만들고 그 안에 docker 볼륨이 들어갈 폴더를 만들었다.</p>

<pre><code>services:
  synapse:
    image: matrixdotorg/synapse
    restart: always
    ports:
      - 8008:8008
    volumes:
      - [볼륨을 물릴 경로]:/data
</code></pre>

<h3 id="2-도메인-물려서-서버-동작시키기" id="2-도메인-물려서-서버-동작시키기">2. 도메인 물려서 서버 동작시키기</h3>

<pre><code>docker run -it --rm -v [볼륨을 물릴 경로]:/data -e SYNAPSE_SERVER_NAME=[서버를 돌릴 도메인 주소] -e SYNAPSE_REPORT_STATS=yes matrixdotorg/synapse:latest generate
</code></pre>

<p>동작시키면 [볼륨을 물릴 경로]에 homeserver.yaml 파일이 생긴다. 이 파일에서 가입을 열고 다른 설정을 할 수 있다.</p>

<p>위 명령어가 잘 동작했다면 서버의 8008 포트에 접속해본다.</p>

<p><img src="https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/96a34a78-442d-4089-8d18-4c2110c883f0.webp" alt="매트릭스 서버가 성공적으로 올라갔을 때 뜨는 웹화면">
위와 같은 화면이 뜨면 성공적으로 올라간 것이다.</p>

<h4 id="3-nginx에-서버-물려서-서비스하기" id="3-nginx에-서버-물려서-서비스하기">3. nginx에 서버 물려서 서비스하기</h4>

<p>nginx는 설치되어 있다는 가정 하에,  <code>/etc/nginx/sites-available/</code> 경로에 매트릭스를 위한 config파일을 하나 만든다. 파일명은 알아만 볼 수 있으면 된다.</p>

<p>기본적인 내용은 다음과 같다</p>

<pre><code>server {

        server_name [서버를 돌릴 도메인 주소];

        location ~ ^(/_matrix|/_synapse/client) {
                proxy_pass http://localhost:8008;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header Host $host;

                client_max_body_size 50M;
                proxy_http_version 1.1;
        }
}
</code></pre>

<p>위 내용으로 config 파일을 만들었다면</p>

<pre><code>ln -s /etc/nginx/sites-available/[설정파일명] /etc/nginx/sites-enabled/[설정파일명]
</code></pre>

<p>을 수행한 후 <code>nginx -t</code> 명령으로 설정에 문제가 없는지 확인한다.</p>

<p><code>systemctl restart nginx</code> nginx를 재시작한다.</p>

<p>nginx가 제대로 돌아가려면 방화벽에서 80번 포트와 443 포트가 열려있어야 한다. 그걸 위해 아래 명령을 수행하거나 또는 다른 툴을 이용해 방화벽을 열어준다.</p>

<p><code>ufw allow &#39;Nginx Full&#39;</code></p>

<h4 id="4-인증서-발급" id="4-인증서-발급">4. 인증서 발급</h4>

<p>certbot을 이용해 인증서를 발급받는다. 이 과정 설명은 생략한다.</p>

<p>인증서를 발급받으면 방금 설정한 nginx 설정 아래쪽에 <code>listen 443 ssl; # managed by Certbot</code>로 시작하는 코드가 몇 줄 생겼을 것이다. 그 위에 <code>listen 8448 ssl;</code>를 추가해준다.</p>

<p>기존의 <code>location</code>과 <code>listen ...</code> 사이에 다음 코드를 추가해준다.</p>

<pre><code>        location /.well-known/matrix/client {
                return 200 &#39;{&#34;m.server&#34;: {&#34;base_url&#34;: &#34;[서비스할 도메인 주소]:443&#34;}}&#39;;
                default_type application/json;
                add_header Access-Control-Allow-Origin *;
        }
        
        location /.well-known/matrix/server {
                default_type application/json;
                add_header Access-Control-Allow-Origin *;
                return 200 &#39;{&#34;m.server&#34;:&#34;[서비스할 도메인 주소]:443&#34;}&#39;;
        }
</code></pre>

<h4 id="3-5-만약-실제-서비스는-서브-도메인으로-계정-핸들은-메인-도메인으로-사용하고-싶다면" id="3-5-만약-실제-서비스는-서브-도메인으로-계정-핸들은-메인-도메인으로-사용하고-싶다면">3.5 만약 실제 서비스는 서브 도메인으로, 계정 핸들은 메인 도메인으로 사용하고 싶다면</h4>

<p>바로 위의 <code>/.well-known/...</code> 설정은 메인 도메인 nginx 설정에 넣어준다. 코드 내부에 넣을 주소는 실제 서비스가 돌아가고 있는 서브도메인 주소를 넣으면 된다.</p>

<p> <code>[볼륨을 물릴 경로]</code> 내부의 파일을 다 지운다. 그 후 docker compose down을 이용해 서버를 내리고</p>

<pre><code>docker run -it --rm -v [볼륨을 물릴 경로]:/data -e SYNAPSE_SERVER_NAME=[핸들로 사용할 도메인] -e SYNAPSE_REPORT_STATS=yes matrixdotorg/synapse:latest generate
</code></pre>

<p>위 명령어를 실행한다.</p>

<h4 id="4-가입-열기" id="4-가입-열기">4. 가입 열기</h4>

<p><code>[볼륨을 물릴 경로]/homeserver.yaml</code>을 열어 <code>enable_registration: true</code>를 추가한다.</p>

<p>이후 docker compose를 올리면 되는데...
내가 해봤을 때 뭔가 설정을 추가해달라는 요구가 뜨며 오류가 났었다. 정확히 무슨 옵션을 추가하라고 했었는지는 기억이 나지 않으니  <code>docker compose up</code> 명령어를 이용해 직접 확인해서 추가하면 된다. 모든 옵션 설정이 끝나면</p>

<p><code>docker compose up -d</code></p>

<p>로 서버를 백그라운드에 올려서 완료.</p>

<h4 id="5-오브젝트-스토리지" id="5-오브젝트-스토리지">5. 오브젝트 스토리지</h4>

<p>여기서 끝인 줄 알았는데 object storage를 연결해야한다는 걸 알게됐다. 버킷 없이 관리할 수도 있지만 자신이 없어서 물려놓기로 했다. 문제는 직접 설치한 게 아니라 도커로 서버를 올렸다는 것.</p>

<p>직접 설치했을 경우 matrix.org에서 제공하는 <a href="https://github.com/matrix-org/synapse-s3-storage-provider" rel="nofollow">synapse-s3-storage-provider</a>를 이용할 수 있으나 도커로 올리면 방법이 없다.</p>

<p>검색을 반복한 끝에 <code>[볼륨을 물릴 경로]/media_store</code>에 rclone으로 오브젝트 스토리지를 mount 하기로 했다. 각자의 object storage의 특성에 맞춰 mount해서 사용하면 된다. media_store는 기본 설정이므로 <code>homeserver.yaml</code>파일에서 설정을 바꿀 수 있다.</p>

<h4 id="6-도움이-되는-사이트" id="6-도움이-되는-사이트">6. 도움이 되는 사이트</h4>

<p><a href="https://federationtester.matrix.org/" rel="nofollow">matrix 연합 테스터</a></p>

<h5 id="7-참조" id="7-참조">7. 참조</h5>

<p><a href="https://theselfhostingblog.com/posts/self-hosting-your-own-matrix-server-on-a-raspberry-pi/" rel="nofollow">https://theselfhostingblog.com/posts/self-hosting-your-own-matrix-server-on-a-raspberry-pi/</a>
<a href="https://matrix-org.github.io/synapse/latest/" rel="nofollow">https://matrix-org.github.io/synapse/latest/</a></p>

<p><a href="/siarte/tag:matrix" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">matrix</span></a> <a href="/siarte/tag:%EC%82%90%EC%82%90%EC%80%BC%EC%80%BC" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">삐삐쀼쀼</span></a></p>

<div class="link-and-banner">
<h1>배너</h1>

<p><img src="https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp"></p>
<p class="banner-code">&lt;a href=&#34;https://blog.daydream.ink/siarte&#34;&gt;&lt;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;&gt;&lt;/a&gt;</p>
</div>
]]></content:encoded>
      <guid>https://blog.daydream.ink/siarte/dockerreul-iyonghae-matrix-yeonhab-caeting-peurotokol-seobeo-olrigi</guid>
      <pubDate>Fri, 09 Aug 2024 12:11:50 +0900</pubDate>
    </item>
    <item>
      <title>오늘의 삽질</title>
      <link>https://blog.daydream.ink/siarte/oneulyi-sabjil</link>
      <description>&lt;![CDATA[openssl 3.0에 provider를 추가한 뒤에는 default provider를 명시적으로 활성해줘야한다. 아니면 원격 접속이 불가능하다.&#xA;&#xA;계속 안 돼서 잘 보이지도 않는 화면에서 고생했네 ㅠ_ㅠ&#xA;&#xA;#오늘의삽질 #삐삐쀼쀼&#xA;&#xA;div class=&#34;link-and-banner&#34;&#xD;&#xA;h1배너/h1&#xD;&#xA;&#xD;&#xA;pimg src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/p&#xD;&#xA;p class=&#34;banner-code&#34;textareaa href=&#34;https://blog.daydream.ink/siarte&#34;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/a/textarea/p&#xD;&#xA;/div]]&gt;</description>
      <content:encoded><![CDATA[<p>openssl 3.0에 provider를 추가한 뒤에는 default provider를 명시적으로 활성해줘야한다. 아니면 원격 접속이 불가능하다.</p>

<p>계속 안 돼서 잘 보이지도 않는 화면에서 고생했네 ㅠ_ㅠ</p>

<p><a href="/siarte/tag:%EC%98%A4%EB%8A%98%EC%9D%98%EC%82%BD%EC%A7%88" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">오늘의삽질</span></a> <a href="/siarte/tag:%EC%82%90%EC%82%90%EC%80%BC%EC%80%BC" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">삐삐쀼쀼</span></a></p>

<div class="link-and-banner">
<h1>배너</h1>

<p><img src="https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp"></p>
<p class="banner-code">&lt;a href=&#34;https://blog.daydream.ink/siarte&#34;&gt;&lt;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;&gt;&lt;/a&gt;</p>
</div>
]]></content:encoded>
      <guid>https://blog.daydream.ink/siarte/oneulyi-sabjil</guid>
      <pubDate>Fri, 22 Mar 2024 13:51:05 +0900</pubDate>
    </item>
    <item>
      <title>마스토돈 로고 변경</title>
      <link>https://blog.daydream.ink/siarte/maseutodon-rogo-byeongyeong</link>
      <description>&lt;![CDATA[url을 보면 알겠지만 이 인스턴스는 마스토돈 인스턴스 잃어버린 섬과 자매이다.&#xA;&#xA;어제 잃어버린 섬의 로고를 바꿨다. 두 가지 기록해두고 싶은 점이 있는데(잊어버리면 귀찮은 점이 있는데) 하나는 기본 로고 브랜딩하는 법, 나머지 하나는 wordmark 로고 변경하는 법.&#xA;&#xA;기본 로고 브랜딩하는 방법&#xA;lib/tasks/branding.rake에서 코드를 확인할 수 있다.&#xA;app/images/에서 logo.svg, app-icon.svg를 자신의 것으로 변경해두면 관련된 모든 아이콘을 변경할 수 있다. (favicon을 비롯한 여러 웹앱 아이콘)&#xA;명령어 사용법은 마스토돈 폴더 안에서 bin/rails branding:generateappicons&#xA;다른 브랜딩 관련 기능도 같은 파일 안에 있으니 확인해보면 좋다.&#xA;&#xA;wordmark 로고 변경하는 법&#xA;wordmark로고는 모바일 화면 위쪽에 떠있는 좌우로 긴 로고를 말하는데 logo-symbol-wordmark.svg파일을 바꿔주면 되지만, 그냥 해서는 적용이 안 된다. 해당 파일을 열어서 코드를 만져줘야 한다.&#xA;&#xA;이 코드를 svg 태그 안에 넣어주자.&#xA;&#xA;br /&#xA;#mastodon #삐삐쀼쀼&#xA;&#xA;div class=&#34;link-and-banner&#34;&#xD;&#xA;h1배너/h1&#xD;&#xA;&#xD;&#xA;pimg src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/p&#xD;&#xA;p class=&#34;banner-code&#34;textareaa href=&#34;https://blog.daydream.ink/siarte&#34;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/a/textarea/p&#xD;&#xA;/div]]&gt;</description>
      <content:encoded><![CDATA[<p>url을 보면 알겠지만 이 인스턴스는 마스토돈 인스턴스 <em><a href="https://daydream.ink" rel="nofollow">잃어버린 섬</a></em>과 자매이다.</p>

<p>어제 잃어버린 섬의 로고를 바꿨다. 두 가지 기록해두고 싶은 점이 있는데(잊어버리면 귀찮은 점이 있는데) 하나는 기본 로고 브랜딩하는 법, 나머지 하나는 wordmark 로고 변경하는 법.</p>

<h2 id="기본-로고-브랜딩하는-방법" id="기본-로고-브랜딩하는-방법">기본 로고 브랜딩하는 방법</h2>

<p><code>lib/tasks/branding.rake</code>에서 코드를 확인할 수 있다.
<code>app/images/</code>에서 <code>logo.svg</code>, <code>app-icon.svg</code>를 자신의 것으로 변경해두면 관련된 모든 아이콘을 변경할 수 있다. (favicon을 비롯한 여러 웹앱 아이콘)
명령어 사용법은 마스토돈 폴더 안에서 <code>bin/rails branding:generate_app_icons</code>
다른 브랜딩 관련 기능도 같은 파일 안에 있으니 확인해보면 좋다.</p>

<h2 id="wordmark-로고-변경하는-법" id="wordmark-로고-변경하는-법">wordmark 로고 변경하는 법</h2>

<p>wordmark로고는 모바일 화면 위쪽에 떠있는 좌우로 긴 로고를 말하는데 <code>logo-symbol-wordmark.svg</code>파일을 바꿔주면 되지만, 그냥 해서는 적용이 안 된다. 해당 파일을 열어서 코드를 만져줘야 한다.</p>

<p><code>&lt;use xlink:href=&#34;#logo-symbol-wordmark&#34;/&gt; &lt;symbol id=&#34;logo-symbol-wordmark&#34;&gt;</code></p>

<p>이 코드를 <code>&lt;svg&gt;</code> 태그 안에 넣어주자.</p>

<p><br/>
<a href="/siarte/tag:mastodon" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">mastodon</span></a> <a href="/siarte/tag:%EC%82%90%EC%82%90%EC%80%BC%EC%80%BC" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">삐삐쀼쀼</span></a></p>

<div class="link-and-banner">
<h1>배너</h1>

<p><img src="https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp"></p>
<p class="banner-code">&lt;a href=&#34;https://blog.daydream.ink/siarte&#34;&gt;&lt;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;&gt;&lt;/a&gt;</p>
</div>
]]></content:encoded>
      <guid>https://blog.daydream.ink/siarte/maseutodon-rogo-byeongyeong</guid>
      <pubDate>Sun, 17 Mar 2024 08:38:18 +0900</pubDate>
    </item>
    <item>
      <title>해시태그 안 되는 버그 해결</title>
      <link>https://blog.daydream.ink/siarte/haesitaegeu-an-doeneun-beogeu-haegyeol</link>
      <description>&lt;![CDATA[mysql 쿼리가 버전 때문인지 잘못되어 있어서 database.go에서 쿼리 살짝 고쳤다. 짧은 내용이라 굳이 남길 필요 있나 했지만 기록 안 해두면 영영 잊어버릴 것 같아서 남겨둔다.&#xA;&#xA;\# 후에 한 칸 띄워주면 제목으로 들어가고 안 띄우면 해시태그로 들어가는 건 재밌네.&#xA;&#xA;br /&#xA;#writefreely #삐삐쀼쀼&#xA;&#xA;div class=&#34;link-and-banner&#34;&#xD;&#xA;h1배너/h1&#xD;&#xA;&#xD;&#xA;pimg src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/p&#xD;&#xA;p class=&#34;banner-code&#34;textareaa href=&#34;https://blog.daydream.ink/siarte&#34;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/a/textarea/p&#xD;&#xA;/div]]&gt;</description>
      <content:encoded><![CDATA[<p>mysql 쿼리가 버전 때문인지 잘못되어 있어서 database.go에서 쿼리 살짝 고쳤다. 짧은 내용이라 굳이 남길 필요 있나 했지만 기록 안 해두면 영영 잊어버릴 것 같아서 남겨둔다.</p>

<p># 후에 한 칸 띄워주면 제목으로 들어가고 안 띄우면 해시태그로 들어가는 건 재밌네.</p>

<p><br/>
<a href="/siarte/tag:writefreely" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">writefreely</span></a> <a href="/siarte/tag:%EC%82%90%EC%82%90%EC%80%BC%EC%80%BC" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">삐삐쀼쀼</span></a></p>

<div class="link-and-banner">
<h1>배너</h1>

<p><img src="https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp"></p>
<p class="banner-code">&lt;a href=&#34;https://blog.daydream.ink/siarte&#34;&gt;&lt;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;&gt;&lt;/a&gt;</p>
</div>
]]></content:encoded>
      <guid>https://blog.daydream.ink/siarte/haesitaegeu-an-doeneun-beogeu-haegyeol</guid>
      <pubDate>Mon, 11 Mar 2024 23:03:58 +0900</pubDate>
    </item>
    <item>
      <title>writefreely 설치 및 약간의 소스 수정 후기</title>
      <link>https://blog.daydream.ink/siarte/writefreely-seolci-mic-yagganyi-soseu-sujeong-hugi</link>
      <description>&lt;![CDATA[설치&#xA;설치는 간단하다. git에서 소스를 받아서 폴더 내부에 존재하는 실행파일(writefreely)을 실행하면 끝.&#xA;&#xA;DB만 잘 설정해주면 되는데 이게 좀 문제였다. 기본 설치 가이드에는 mysql로 되어있고 config 설정에도 mysql이 우선으로 되어있는데 실제 프로그램은 sqlite를 기반으로 짜인 것 같다. mysql로 쓰면 databese를 따로 생성해줘야하는데 sqlite는 그렇지 않고, Makefile에도 태그가 전부 sqlite로 붙어있었다.&#xA;&#xA;mysql도 오랜만이라 권한 설정하느라 애먹긴 했는데 이건 writefreely와는 좀 별개의 이야기이므로 패스.&#xA;&#xA;소스 수정&#xA;설치해놓고 보니 문제가 있었다. 연합우주에서 볼 수 있는 프로필 사진 설정이 안 되는 것. 원래 없는 건 줄 알았는데 소스를 뜯어보니 그건 아니었다.&#xA;&#xA;블로그 제목의 첫글자를 따서 기본으로 들어있는 프로필 사진을 쓰게 되어있는데 이게 숫자와 로마자만 들어있어서... 거기 해당되지 않는 글자면 아예 빈 string 값이 반환된다. 황당해라.&#xA;&#xA;그래서 예쁘지도 않은 플사에 매달리지 않고 서버 기본 프로필 사진을 사용할 수 있도록 소스를 고쳤다. 문제는 이미 마련된 실행파일에 넣는 방법을 모르겠다는 것. golang도 처음, Makefile도 거의 처음이라 수정 버전 반영 시키는데 한참 해맸다.&#xA;&#xA;폴더 안에 있는 cmd/writefreely 경로 안에 빌드된 실행파일이 있었다. Makefile 보면 나오는데 어딘지 못 찾은 내가 바보지... 어쩐지 아무리 빌드해도 바뀌질 않더라. 다음에는 까먹지 않으려고 한 번 적어둔다.&#xA;&#xA;br /&#xA;#writefreely #삐삐쀼쀼&#xA;&#xA;div class=&#34;link-and-banner&#34;&#xD;&#xA;h1배너/h1&#xD;&#xA;&#xD;&#xA;pimg src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/p&#xD;&#xA;p class=&#34;banner-code&#34;textareaa href=&#34;https://blog.daydream.ink/siarte&#34;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;/a/textarea/p&#xD;&#xA;/div]]&gt;</description>
      <content:encoded><![CDATA[<h3 id="설치">설치</h3>

<p>설치는 간단하다. git에서 소스를 받아서 폴더 내부에 존재하는 실행파일(writefreely)을 실행하면 끝.</p>

<p>DB만 잘 설정해주면 되는데 이게 좀 문제였다. 기본 설치 가이드에는 mysql로 되어있고 config 설정에도 mysql이 우선으로 되어있는데 실제 프로그램은 sqlite를 기반으로 짜인 것 같다. mysql로 쓰면 databese를 따로 생성해줘야하는데 sqlite는 그렇지 않고, Makefile에도 태그가 전부 sqlite로 붙어있었다.</p>

<p>mysql도 오랜만이라 권한 설정하느라 애먹긴 했는데 이건 writefreely와는 좀 별개의 이야기이므로 패스.</p>

<h3 id="소스-수정" id="소스-수정">소스 수정</h3>

<p>설치해놓고 보니 문제가 있었다. 연합우주에서 볼 수 있는 프로필 사진 설정이 안 되는 것. 원래 없는 건 줄 알았는데 소스를 뜯어보니 그건 아니었다.</p>

<p>블로그 제목의 첫글자를 따서 기본으로 들어있는 프로필 사진을 쓰게 되어있는데 이게 숫자와 로마자만 들어있어서... 거기 해당되지 않는 글자면 아예 빈 string 값이 반환된다. 황당해라.</p>

<p>그래서 예쁘지도 않은 플사에 매달리지 않고 서버 기본 프로필 사진을 사용할 수 있도록 소스를 고쳤다. 문제는 이미 마련된 실행파일에 넣는 방법을 모르겠다는 것. golang도 처음, Makefile도 거의 처음이라 수정 버전 반영 시키는데 한참 해맸다.</p>

<p>폴더 안에 있는 <code>cmd/writefreely</code> 경로 안에 빌드된 실행파일이 있었다. Makefile 보면 나오는데 어딘지 못 찾은 내가 바보지... 어쩐지 아무리 빌드해도 바뀌질 않더라. 다음에는 까먹지 않으려고 한 번 적어둔다.</p>

<p><br/>
<a href="/siarte/tag:writefreely" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">writefreely</span></a> <a href="/siarte/tag:%EC%82%90%EC%82%90%EC%80%BC%EC%80%BC" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">삐삐쀼쀼</span></a></p>

<div class="link-and-banner">
<h1>배너</h1>

<p><img src="https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp"></p>
<p class="banner-code">&lt;a href=&#34;https://blog.daydream.ink/siarte&#34;&gt;&lt;img src=&#34;https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnftfbml9zxa/b/bucket-20230907-0739/o/misskey/9a3d7675-907b-4bf9-9de0-431b4a0c0d22.webp&#34;&gt;&lt;/a&gt;</p>
</div>
]]></content:encoded>
      <guid>https://blog.daydream.ink/siarte/writefreely-seolci-mic-yagganyi-soseu-sujeong-hugi</guid>
      <pubDate>Sun, 10 Mar 2024 01:26:40 +0900</pubDate>
    </item>
  </channel>
</rss>