Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

フラグメント識別子の再設定を webUI から行えるようにする #223

Merged
merged 26 commits into from
Nov 21, 2020
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
a8f1abc
add ruby-gems "sidekiq"
koi-chan Aug 13, 2020
8676b28
setup sidekiq
koi-chan Aug 13, 2020
cb415f3
rails g job refresh_digests
koi-chan Aug 13, 2020
bcc7963
ウェブ UI からジョブにフラグメント識別子の再設定を実行出来るようにした
koi-chan Aug 13, 2020
30a8717
Sidekiq の状態を管理画面から把握できるようにした
koi-chan Aug 15, 2020
cbb1a4d
digest が設定されていないメッセージを表示しようとしたとき、自動的にバックグラウンドで計算・保存するようにした
koi-chan Aug 15, 2020
570b7f3
Travis-CI で Redis が使えるようにする
koi-chan Aug 15, 2020
c370574
rake タスクと Job で重複した処理を内部ライブラリとして切り出す
koi-chan Aug 26, 2020
bb9bbca
コントローラーを移動する
koi-chan Aug 26, 2020
11c86cf
メッセージ一括処理を新規管理メニューに追加し、フラグメント識別子の再設定をその中に移動
koi-chan Aug 26, 2020
fb210c5
Merge branch 'master' into use-active-job-for-refresh-digests
koi-chan Sep 10, 2020
3a346bf
スコープの内外で同じ変数名を使用していたのを修正
koi-chan Sep 13, 2020
3d6d052
sidekiq について README に追記
koi-chan Sep 23, 2020
c2bc9c3
sidekiq 用の systemd 設定ファイルを追加
koi-chan Sep 23, 2020
611c9f5
initializer に sidekiq が使う redis 接続設定を追加
koi-chan Sep 23, 2020
bc0e3de
Merge branch 'master' into use-active-job-for-refresh-digests
koi-chan Sep 23, 2020
f112f8f
redis のデフォルトポートを間違えていたのを修正
koi-chan Sep 23, 2020
f51f4cc
メソッド名と処理の乖離を解消した
koi-chan Nov 6, 2020
8a1ec6f
ダイジェスト値が保存されていないメッセージを呼び出しと同時に生成・保存する機能を削除した
koi-chan Nov 9, 2020
a75bda9
refresh_digests.rb: case式のスタイルを修正する
ochaochaocha3 Nov 11, 2020
fc39960
Merge pull request #227 from cre-ne-jp/use-active-job-for-refresh-dig…
ochaochaocha3 Nov 12, 2020
6f19481
Merge branch 'master' into use-active-job-for-refresh-digests-merge_m…
ochaochaocha3 Nov 15, 2020
8649e07
管理画面:Redisに接続できない場合にメッセージを表示する
ochaochaocha3 Nov 15, 2020
d4a14df
Actions: RedisのDockerイメージを使う
ochaochaocha3 Nov 15, 2020
23a1977
Merge pull request #229 from cre-ne-jp/use-active-job-for-refresh-dig…
ochaochaocha3 Nov 16, 2020
14d64ca
新メニュー項目「メッセージ一括処理」に移動した後の削除漏れを修正
koi-chan Nov 20, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@ gem 'pry-rails'
# ナビゲーションの定義
gem 'simple-navigation'

# ActiveJob バックエンド
gem 'sidekiq'

group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug'
Expand Down
23 changes: 15 additions & 8 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ GEM
zeitwerk (~> 2.2, >= 2.2.2)
ansi (1.5.0)
ast (2.4.1)
autoprefixer-rails (9.8.6.3)
autoprefixer-rails (10.0.0.2)
execjs
bcrypt (3.1.16)
bindex (0.8.1)
Expand All @@ -85,6 +85,7 @@ GEM
railties (> 3.1)
coderay (1.1.3)
concurrent-ruby (1.1.7)
connection_pool (2.2.3)
crass (1.0.6)
docile (1.3.2)
erubi (1.9.0)
Expand Down Expand Up @@ -121,7 +122,7 @@ GEM
minitest (>= 3.0)
i18n (1.8.5)
concurrent-ruby (~> 1.0)
jbuilder (2.10.0)
jbuilder (2.10.1)
activesupport (>= 5.0.0)
jquery-rails (4.4.0)
rails-dom-testing (>= 1, < 3)
Expand Down Expand Up @@ -176,7 +177,7 @@ GEM
multipart-post (2.1.1)
mysql2 (0.5.3)
nenv (0.3.0)
nio4r (2.5.3)
nio4r (2.5.4)
nokogiri (1.10.10)
mini_portile2 (~> 2.4.0)
notiffany (0.1.3)
Expand Down Expand Up @@ -240,20 +241,21 @@ GEM
ffi (~> 1.0)
rdoc (6.2.1)
redcarpet (3.5.0)
regexp_parser (1.7.1)
redis (4.2.2)
regexp_parser (1.8.0)
rexml (3.2.4)
rubocop (0.90.0)
rubocop (0.91.0)
parallel (~> 1.10)
parser (>= 2.7.1.1)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.7)
rexml
rubocop-ast (>= 0.3.0, < 1.0)
rubocop-ast (>= 0.4.0, < 1.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 2.0)
rubocop-ast (0.4.0)
rubocop-ast (0.4.2)
parser (>= 2.7.1.4)
rubocop-rails (2.8.0)
rubocop-rails (2.8.1)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 0.87.0)
Expand All @@ -269,6 +271,10 @@ GEM
sdoc (1.1.0)
rdoc (>= 5.0)
shellany (0.0.1)
sidekiq (6.1.2)
connection_pool (>= 2.2.2)
rack (~> 2.0)
redis (>= 4.2.0)
simple-navigation (4.1.0)
activesupport (>= 2.3.2)
simple_calendar (2.4.1)
Expand Down Expand Up @@ -355,6 +361,7 @@ DEPENDENCIES
rubocop-rails
sassc-rails (>= 2.1)
sdoc (~> 1.0)
sidekiq
simple-navigation
simple_calendar (~> 2.0)
simple_enum
Expand Down
14 changes: 11 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ IRC ボットを常駐させることでチャットログをチャンネル単
* Linux または OSX
* Ruby 2.3.0 以降
* MySQL または MariaDB
* Redis

## インストール

[MySQL](https://www-jp.mysql.com/) もしくは [MariaDB](https://mariadb.org/) をインストールしていない場合はインストールしてください。
[MySQL](https://www-jp.mysql.com/) もしくは [MariaDB](https://mariadb.org/) と、[Redis](https://redis.io/) をインストールしていない場合はインストールしてください。

全文検索機能を動作させるため、[Groonga](http://groonga.org/ja/) および [Mroonga](http://mroonga.org/ja/) のインストールが必要です。Mroonga 公式サイトより[インストール方法](http://mroonga.org/ja/docs/install.html)を参照してインストールを行ってください。

Expand Down Expand Up @@ -44,6 +45,9 @@ gem install bundler
* [インストール](doc/install.md)
* [IRC の接続設定](doc/irc.md)
* [ウェブサーバの設定](doc/nginx.md)
* [バックグラウンドジョブの設定](doc/sidekiq.md)

systemd による制御を行なう場合は [systemd](doc/systemd.md) を参照してください。

## IRC ボットの起動

Expand All @@ -61,14 +65,18 @@ cd /path/to/log-archiver
bin/ircbot -c test # /path/to/log-archiver/config/test.yaml を使用する場合
```

systemd による制御を行なう場合は [systemd](doc/systemd.md) を参照してください。

## Web アプリケーションの起動

記録されたログを閲覧するための Web アプリケーションは、Rails アプリケーションとして実装されています。

単体で起動させることもできますが、Apache や nginx からのリバースプロキシ設定を行なうことをお勧めします。

## バックグラウンドジョブの起動

バックグラウンドジョブを実行するためのアプリケーションを起動します。

バックグラウンドジョブを使用しないのであれば、省略可能です。

## 開発者の方へ

テストを実行する際は「[テストの実行手順](doc/testing.md)」を参照してください。
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class Admin::EditMessages::RefreshDigestsController < ApplicationController
before_action(:require_login)

def show
RefreshDigestsJob.perform_later
flash[:success] = t('views.flash.refreshed_digests')
redirect_to(admin_edit_messages_path)
end
end
6 changes: 6 additions & 0 deletions app/controllers/admin/edit_messages_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class Admin::EditMessagesController < ApplicationController
before_action(:require_login)

def index
end
end
2 changes: 2 additions & 0 deletions app/controllers/admin/status_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,7 @@ def show
rescue => e
@exception_on_fetching_irc_bot_status = e
end

@sidekiq_statuses = Sidekiq::Stats.new
end
end
7 changes: 7 additions & 0 deletions app/jobs/application_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class ApplicationJob < ActiveJob::Base
# Automatically retry jobs that encountered a deadlock
# retry_on ActiveRecord::Deadlocked

# Most jobs are safe to ignore if the underlying records are no longer available
# discard_on ActiveJob::DeserializationError
end
24 changes: 24 additions & 0 deletions app/jobs/refresh_digests_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# frozen_string_literal: true

class RefreshDigestsJob < ApplicationJob
queue_as :default

# ジョブ本体
# @return [void]
def perform
[ConversationMessage, Message].each do |m|
refresh_digests(m)
end
end

private

# ハッシュ値を更新する
# @param [Class] model 対象モデル
# @param [Integer] batch_size 一度に処理する件数
# @return [void]
def refresh_digests(model, batch_size = 10000)
handler = LogArchiver::RefreshDigests.new(:job)
handler.refresh_digests(model, batch_size)
end
end
7 changes: 7 additions & 0 deletions app/views/admin/channels/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,13 @@
<% end %>
</tbody>
</table>

<h2>一括処理</h2>
<p>全てのチャンネル・メッセージを対象として、一括処理を行ないます。</p>

<h3>フラグメント識別子の再設定</h3>
<p>全てのメッセージのフラグメント識別子を初期化し、再計算します。</p>
<p><%= link_to('フラグメント識別子を再設定する', admin_edit_messages_refresh_digests_path, class: 'btn btn-success') %></p>
ochaochaocha3 marked this conversation as resolved.
Show resolved Hide resolved
</div>
</div>
</div>
Expand Down
29 changes: 29 additions & 0 deletions app/views/admin/edit_messages/index.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<% title(['管理', 'メッセージ一括処理']) %>
<div class="container main-container">
<div class="row">
<%= render('shared/admin/navigation') %>

<div class="col-xs-12 col-sm-9">
<div class="main-panel">
<div class="panel-body">
<%= render('shared/flash') %>

<ol class="breadcrumb visible-xs-block">
<li>管理</li>
<li class="active">メッセージ一括処理</li>
</ol>

<div class="page-header">
<h1>メッセージ一括処理</h1>
</div>

<p>全てのチャンネル・メッセージを対象として、一括処理を行ないます。</p>

<h2>フラグメント識別子の再設定</h2>
<p>全てのメッセージのフラグメント識別子を初期化し、再計算します。</p>
<p><%= link_to('フラグメント識別子を再設定する', admin_edit_messages_refresh_digests_path, class: 'btn btn-success') %></p>
</div>
</div>
</div>
</div>
</div>
41 changes: 41 additions & 0 deletions app/views/admin/status/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,47 @@
</table>
<% end %>
</section>

<section class="sidekiq-status">
<h2>バックグラウンドジョブの状態</h2>
<p><%= link_to('詳細を見る(Sidekiq Dashboard)', admin_sidekiq_web_path) %></p>
<table class="table table-striped sidekiq-status-list">
<tbody>
<tr>
<th class="sidekiq-status-version">バージョン</th>
<td id="sidekiq-version" class="sidekiq-status-version"><%= Sidekiq::VERSION %></td>
</tr>
<tr>
<th class="sidekiq-status-processed">実行完了</th>
<td id="sidekiq-processed" class="sidekiq-status-processed"><%= @sidekiq_statuses.processed %></td>
</tr>
<tr>
<th class="sidekiq-status-processes">実行中</th>
<td id="sidekiq-processes" class="sidekiq-status-processes"><%= @sidekiq_statuses.processes_size %></td>
</tr>
<tr>
<th class="sidekiq-status-failed">失敗</th>
<td id="sidekiq-failed" class="sidekiq-status-failed"><%= @sidekiq_statuses.failed %></td>
</tr>
<tr>
<th class="sidekiq-status-scheduled">予定キュー内</th>
<td id="sidekiq-scheduled" class="sidekiq-status-scheduled"><%= @sidekiq_statuses.scheduled_size %></td>
</tr>
<tr>
<th class="sidekiq-status-retry">再試行キュー内</th>
<td id="sidekiq-retry" class="sidekiq-status-retry"><%= @sidekiq_statuses.retry_size %></td>
</tr>
<tr>
<th class="sidekiq-status-dead">デッド状態</th>
<td id="sidekiq-dead" class="sidekiq-status-dead"><%= @sidekiq_statuses.dead_size %></td>
</tr>
<tr>
<th class="sidekiq-status-workers">ワーカー</th>
<td id="sidekiq-workers" class="sidekiq-status-workers"><%= @sidekiq_statuses.workers_size %></td>
</tr>
</tbody>
</table>
</section>
</div>
</div>
</div>
Expand Down
4 changes: 4 additions & 0 deletions app/views/shared/admin/_message_detail.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
<th scope="row" class="message-body">内容</th>
<td class="message-body"><%= raw(linkify(m.message)) %></td>
</tr>
<tr>
<th scope="row" class="message-digest">フラグメント識別子</th>
<td class="message-body"><%= m.fragment_id %></td>
</tr>
<tr>
<th scope="row" class="message-status">現在の設定</th>
<% if m.kind_of?(ConversationMessage) %>
Expand Down
5 changes: 4 additions & 1 deletion config/admin_navigation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,11 @@
admin_channels_path,
options[].merge({ highlights_on: channels_pattern }))

primary.item(:admin_nav_edit_messages,
fa_icon('comments', text: 'メッセージ一括処理'),
admin_edit_messages_path, options[])
primary.item(:admin_nav_archived_messages,
fa_icon('comments', text: '非表示の発言'),
fa_icon('times', text: '非表示の発言'),
admin_archived_conversation_messages_path, options[])
primary.item(:admin_nav_archive_reasons,
fa_icon('question-circle', text: '発言の非表示理由'),
Expand Down
12 changes: 12 additions & 0 deletions config/initializers/sidekiq.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# vim: fileencoding=utf-8
# frozen_string_literal: true

Rails.application.config.active_job.queue_adapter = :sidekiq

Sidekiq.configure_server do |config|
config.redis = { url: ENV['REDIS_URL'] || 'redis://localhost:6379/0' }
end

Sidekiq.configure_client do |config|
config.redis = { url: ENV['REDIS_URL'] || 'redis://localhost:6379/0' }
end
1 change: 1 addition & 0 deletions config/locales/ja_views.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ ja:
removed_user: 利用者を削除しました。
updated_settings: 設定を更新しました。
updated_last_speech: 最終発言のキャッシュを更新しました。
refreshed_digests: フラグメント識別子の再設定をバックグラウンドで実行します。
failed_to_update_last_speech: 最終発言キャッシュの更新に失敗しました。
added_archive_reason: 発言の非表示理由を追加しました。
updated_archive_reason: 発言の非表示理由を更新しました。
Expand Down
11 changes: 11 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# frozen_string_literal: true

require 'sidekiq/web'
require 'log_archiver/auth_constraint'

Rails.application.routes.draw do
root 'welcome#index'

Expand Down Expand Up @@ -40,6 +43,8 @@
get 'admin' => 'admin#index', as: :admin

namespace :admin do
mount Sidekiq::Web => 'sidekiq', constraints: LogArchiver::AuthConstraint.new

get 'status' => 'status#show', as: 'status'

namespace :channels do
Expand All @@ -56,6 +61,12 @@

resource :channel_order, only: %i(show)

namespace :edit_messages do
resource :refresh_digests, only: %i(show)
end

get 'edit_messages' => 'edit_messages#index', as: 'edit_messages'

resources :archived_conversation_messages, only: %i(index show create edit update destroy)
resources :archive_reasons, only: %i(index new create show edit update)
end
Expand Down
4 changes: 4 additions & 0 deletions doc/log-archiver.default
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,7 @@ SECRET_KEY_BASE=
# UNICORN_OOM_CHECK_CYCLE
# Oom の閾値に達しているかを何回のアクセスごとに調べるかを設定します。
#UNICORN_OOM_CHECK_CYCLE=16

# REDIS_URL
# バックグラウンドジョブの実行に必要な redis データベースへの接続設定
#REDIS_URL='redis://localhost:6379/0'
2 changes: 1 addition & 1 deletion doc/log-archiver_ircbot.service
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ PIDFile=/home/log-archiver/log-archiver/tmp/pids/ircbot.pid
WorkingDirectory=/home/log-archiver/log-archiver
Restart=always

ExecStart=/home/log-archiver/log-archiver/bin/ircbot -v -m production
ExecStart=/home/log-archiver/log-archiver/bin/ircbot -v -m $RAILS_ENV
#ExecReload=/usr/bin/kill -HUP $MAINPID
ExecStop=/usr/bin/kill $MAINPID

Expand Down
21 changes: 21 additions & 0 deletions doc/log-archiver_sidekiq.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[Unit]
Description=LogArchiver background server(Sidekiq) - IRC Log Save and Viewer
Documentation=https://github.com/cre-ne-jp/log-archiver
After=network.target, redis.service

[Service]
User=log-archiver
Group=log-archiver
EnvironmentFile=/etc/default/log-archiver
SyslogIdentifier=log-archiver-sidekiq
Type=simple
PIDFile=/home/log-archiver/log-archiver/tmp/pids/sidekiq.pid
WorkingDirectory=/home/log-archiver/log-archiver
Restart=always

ExecStart=/usr/bin/bundle exec "sidekiq -e $RAILS_ENV"
ExecReload=/usr/bin/kill -USR2 $MAINPID
ExecStop=/usr/bin/kill -QUIT $MAINPID

[Install]
WantedBy=multi-user.target
Loading