ReverseProxy時におけるGitLabのAvatar問題

ReverseProxyをかましたGitLabではAvatar画像が表示されない場合がある。

12_avatar_icon_is_not_displayed

把握している限りではこんなとき。

  • AvatarアイコンをUploadして変更した。
  • Gravatarを使わないでDefaultのアイコンを表示している。

今回はこの問題を解決したいと思います。

原因を探す

画像が表示されないの原因を特定するためにimgタグのURLを見てみる。

<img alt=”User activity” src=”http://<HostName>:8000/gitlab//upload/user/avatar/2/avatar.png”>

8000番ポートはgitlab-ctl reconfigureしたときの設定ファイルに8000番を指定したためと思われるが、8000番ポートは外部から見せないようにしているためこのURLでは404 not foundどころか接続さえできない。

そもそもなんでhttpからのURLで出力しちゃうかなぁ。。。

対策方法

出力内容が間違っているのならその内容を正さないといけない。適当なキーワードでGoogleで検索したところこのページがヒットした。中身を見てみるとhttpdの設定で解決しようとしているのがあったが、gitlabの設定で解決できそうな方法があった。

I just had to make sure that in /home/git/gitlab/config/environments/production.rb the following config was changed from false to true….

config.serve_static_assets = true

結果として、この方法だけでは解決できなかった。(ReverseProxyせずにアクセスする場合は、この設定だけでよさそう。…未確認。)

上記の設定はサブディレクトリで動作させる際に/gitlabで/publicの中を参照できるようになる。設定しないと404がリターンされた。サブディレクトリで動作させるという点では必要な設定ではあるけれど、URLがhttpから始まらないようにするというところでは少したりないみたい。

ソースを少し修正する

設定値を変更するだけでは解決できなさそうだったので、出力している箇所を特定することにした。

軽く調べたところ、以下の部分(/opt/gitlab/embedded/service/gitlab-rails/app/models/user.rb)でAvatarのURLを生成していることがわかった。

  def avatar_url(size = nil)
    if avatar.present?
      [gitlab_config.url, avatar.url].join("/")
    else
      GravatarService.new.execute(email, size)
    end
  end

rubyに強くないのだが、何となくgitlab_confg.urlとavatar.urlを”/”でjoinして返しているように見える。gitlab_config.urlがこの環境でのhttp://<HostaName>:8000/gitlabだと信じて、avatar.urlのみ返すように修正。

  def avatar_url(size = nil)
    if avatar.present?
      #[gitlab_config.url, avatar.url].join("/")
      avatar.url
    else
      GravatarService.new.execute(email, size)
    end
  end

その出力結果がこちら。

<img alt=”User activity” src=”/gitlab/uploads/user/avatar/2/avatar.png”>

うーん。予想からするとちょっと違ったんだけれど、結果オーライ?/gitlabからの絶対パスになっているし、パスも正しい内容になっている。

だいたいのところはこれで直るが、一部の箇所で相変わらずAvatar画像が表示されなかった。

13_avatar_icon_is_not_displayed

こちらについてはだいたいの当たりを付けたけれど…。環境うち国おいてこの方針でいいのかは非常に微妙。お手軽に構築することを目指しているだけに、ソースを編集するとなるとお手軽ではない、ですよね?

これならまだvirtualHostでhttp://gitlab.<HostName>/にした方がまだよいのかも。

そんなこんなで、以上を対策方法とします。