From 04329216c4e14909e304dd7aaa33b445452f40d5 Mon Sep 17 00:00:00 2001 From: itsecbern Date: Fri, 17 Apr 2026 21:27:07 +0200 Subject: [PATCH 1/5] Add missing jq dependency --- deployment/systemd/README.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/deployment/systemd/README.md b/deployment/systemd/README.md index 8c7fc1e..798c8a1 100644 --- a/deployment/systemd/README.md +++ b/deployment/systemd/README.md @@ -21,17 +21,11 @@ For **containerized** Fail2Ban UI (Podman/Docker) talking to the host Fail2Ban s In this case we will run **Fail2Ban-UI from `/opt/fail2ban-ui/`** using systemd. ### Prerequisites -Install **Go 1.24+** and required dependencies: +Install **Go 1.25+** and required dependencies: ```bash - sudo dnf install -y golang git + sudo dnf install -y golang git jq ``` -> **Note:** Whois lookups are now performed by Fail2Ban UI directly (no Linux `whois` binary required). - -> **Note:** GeoIP lookups can use either: -> - **Built-in (ip-api.com)**: Default option, requires no installation -> - **MaxMind (Local Database)**: Optional, requires MaxMind GeoIP database at `/usr/share/GeoIP/GeoLite2-Country.mmdb` - -> **Note:** The local Fail2ban service is optional. Fail2Ban-UI can manage remote Fail2ban servers via SSH or API agents without requiring a local Fail2ban installation. +> **Note:** A local Fail2ban installation is optional. Fail2Ban-UI can manage remote Fail2ban servers via SSH or API agents without requiring a local Fail2ban installation. Clone the repository to `/opt/fail2ban-ui`: ```bash From 2d76abca61ad8b1a5a855c474a518f14a040896c Mon Sep 17 00:00:00 2001 From: itsecbern Date: Fri, 17 Apr 2026 21:32:18 +0200 Subject: [PATCH 2/5] Check for jq --- docs/troubleshooting.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 38432f6..9079913 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -27,6 +27,7 @@ firewall-cmd --reload Check: +* The "jq" package is installed * Fail2Ban is running and socket exists * Container has the socket mounted * Permissions allow access to the socket @@ -35,6 +36,9 @@ Check: Examples: ```bash +# check on RHEL / Rocky / Amlalinux +rpm -qa | grep jq + systemctl status fail2ban ls -la /var/run/fail2ban/fail2ban.sock fail2ban-client status @@ -451,4 +455,4 @@ If the UI loads but real-time updates fail: Reference configurations: -- [`docs/reverse-proxy.md`](https://github.com/swissmakers/fail2ban-ui/blob/main/docs/reverse-proxy.md) \ No newline at end of file +- [`docs/reverse-proxy.md`](https://github.com/swissmakers/fail2ban-ui/blob/main/docs/reverse-proxy.md) From eac2196b28b14c1b8c00f6e32dad3d3414876312 Mon Sep 17 00:00:00 2001 From: Michael Ferioli Date: Tue, 28 Apr 2026 07:08:40 -0400 Subject: [PATCH 3/5] feat(api): cap banned IPs per jail in /api/summary response The dashboard's /api/summary handler enumerates every active jail and returns the FULL banned-IP list for each. On hosts with large jails (e.g. 4,500+ active bans on one jail across 17 active jails), this single endpoint can take 3+ minutes to respond, exceeding any reasonable HTTP gateway/proxy timeout (we hit a 60s ALB idle_timeout default that returned 504). The dashboard renders only the first 5 IPs per jail by default (renderBannedIPs, maxVisible=5), so returning a few hundred is more than enough for the UI's needs. This patch caps BannedIPs per jail at 100 (configurable via the FAIL2BAN_UI_SUMMARY_MAX_IPS env var; set to 0 to disable). The accurate TotalBanned count is always preserved -- only the BannedIPs slice is truncated. Reproduction: fail2ban-client status nginx-property-scraper # ~4500 banned IPs curl http://localhost:8080/api/summary?serverId=local # times out at >180s After the patch (FAIL2BAN_UI_SUMMARY_MAX_IPS=100): curl http://localhost:8080/api/summary?serverId=local # responds in <1s, 100 IPs per jail, accurate TotalBanned Trade-offs: a future user who actually wants the full IP list per jail in /api/summary can opt out via FAIL2BAN_UI_SUMMARY_MAX_IPS=0. A follow-up could expose the full list via a paginated /api/jails/:jail endpoint, but that's out of scope for this fix. --- internal/fail2ban/connector_global.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/internal/fail2ban/connector_global.go b/internal/fail2ban/connector_global.go index 117ff30..a7bcd06 100644 --- a/internal/fail2ban/connector_global.go +++ b/internal/fail2ban/connector_global.go @@ -19,10 +19,28 @@ package fail2ban import ( "context" + "os" "sort" + "strconv" "sync" ) +// summaryMaxBannedIPs caps the number of banned IPs returned per jail in +// the /api/summary response. The accurate TotalBanned count is always +// preserved; only the BannedIPs slice is truncated. Set the +// FAIL2BAN_UI_SUMMARY_MAX_IPS env var to 0 to disable the cap. +var summaryMaxBannedIPs = func() int { + v := os.Getenv("FAIL2BAN_UI_SUMMARY_MAX_IPS") + if v == "" { + return 100 + } + n, err := strconv.Atoi(v) + if err != nil || n < 0 { + return 100 + } + return n +}() + // ========================================================================= // Types // ========================================================================= @@ -93,10 +111,14 @@ func collectJailInfos(ctx context.Context, jails []string, getBannedIPs bannedIP results <- jailResult{err: err} return } + totalBanned := len(ips) + if summaryMaxBannedIPs > 0 && totalBanned > summaryMaxBannedIPs { + ips = ips[:summaryMaxBannedIPs] + } results <- jailResult{ jail: JailInfo{ JailName: j, - TotalBanned: len(ips), + TotalBanned: totalBanned, BannedIPs: ips, Enabled: true, }, From 879eca2237b01c076085def0e4be341f76a02227 Mon Sep 17 00:00:00 2001 From: m4549071758 Date: Sat, 16 May 2026 12:47:12 +0900 Subject: [PATCH 4/5] feat(lang): add japanese translation --- pkg/web/locales/ja.json | 577 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 577 insertions(+) create mode 100644 pkg/web/locales/ja.json diff --git a/pkg/web/locales/ja.json b/pkg/web/locales/ja.json new file mode 100644 index 0000000..97bc0ca --- /dev/null +++ b/pkg/web/locales/ja.json @@ -0,0 +1,577 @@ +{ + "meta.language_name": "日本語", + "page.title": "Fail2ban UI ダッシュボード", + "nav.dashboard": "ダッシュボード", + "nav.filter_debug": "フィルタのデバッグ", + "nav.settings": "設定", + "restart_banner.message": "Fail2banの設定が変更されました。変更を適用するには、", + "restart_banner.button": "サービスを再起動", + "restart_banner.restart_success": "Fail2banサービスが再起動され、ヘルスチェックに合格しました", + "restart_banner.reload_success": "Fail2banの設定が正常に再読み込みされました(systemdサービスは再起動されていません)", + "dashboard.title": "ダッシュボード", + "dashboard.overview": "アクティブなJailとブロックの概要", + "dashboard.overview_hint": "検索機能を使用してブロック済みIPをフィルタリングし、JailをクリックしてJailの設定を編集してください。", + "dashboard.search_label": "ブロック済みIPを検索", + "dashboard.search_placeholder": "IPアドレスを入力して検索", + "dashboard.external_ip": "外部IP:", + "dashboard.manage_servers": "サーバー管理", + "dashboard.no_servers_title": "Fail2banサーバーが未設定です", + "dashboard.no_servers_body": "Fail2banインスタンスの監視と制御を開始するにはサーバーを追加してください。", + "dashboard.loading_summary": "サマリーデータを読み込み中…", + "dashboard.errors.summary_failed": "サーバーからサマリーを読み込めませんでした。", + "dashboard.no_enabled_servers_title": "アクティブなコネクタがありません", + "dashboard.no_enabled_servers_body": "ローカルコネクタを有効にするか、リモートのFail2banサーバーを登録してライブデータを確認してください。", + "dashboard.jail_local_warning_title": "このサーバーのjail.localはFail2ban-UIによって管理されていません", + "dashboard.jail_local_warning_body": "選択されたサーバー上の /etc/fail2ban/jail.local は存在しますが、Fail2ban-UI によって管理されていません。コールバックアクション(ui-custom-action)が欠落しているため、ブロック/解除イベントが記録されず、メールアラートも送信されません。この問題を解決するには、jail.local 内の各 Jail セクションをそれぞれ /etc/fail2ban/jail.d/ 以下の個別ファイルに移動してください(デフォルトを保持する場合は jailname.conf、既存の .conf を上書きする場合は jailname.local を使用してください)。その後、jail.local を削除すると Fail2ban-UI が独自の管理バージョンを作成できます(設定ページで一度保存するとファイルが生成されます)。また、/etc/fail2ban/ ディレクトリへの Fail2ban-UI の書き込み権限も確認してください(詳細はドキュメントを参照してください)。", + "dashboard.cards.active_jails": "アクティブなJail", + "dashboard.cards.total_banned": "ブロック済みIP総数", + "dashboard.cards.new_last_hour": "過去1時間の新規", + "dashboard.cards.total_logged": "保存済みブロックイベント", + "dashboard.cards.recurring_week": "繰り返しIP", + "dashboard.cards.recurring_hint": "繰り返し違反者(過去7日間)", + "dashboard.table.jail_name": "Jail名", + "dashboard.table.total_banned": "ブロック総数", + "dashboard.table.new_last_hour": "過去1時間の新規", + "dashboard.table.banned_ips": "ブロック済みIP(解除)", + "dashboard.no_jails": "Jailが見つかりませんでした。", + "dashboard.overview_detail": "IPを検索するためにリストを展開する必要はありません。", + "dashboard.table.time": "時刻", + "dashboard.table.jail": "Jail", + "dashboard.table.ip": "IP", + "dashboard.table.log_line": "ログ行", + "dashboard.no_banned_ips": "ブロック済みIPなし", + "dashboard.unban": "ブロック解除", + "dashboard.manual_block.title": "IPの手動ブロック", + "dashboard.manual_block.subtitle": "特定のJailでIPアドレスを手動ブロックします。", + "dashboard.manual_block.expand_hint": "クリックして展開し、IPアドレスをブロック", + "dashboard.manual_block.jail_label": "Jailを選択", + "dashboard.manual_block.jail_placeholder": "Jailを選択...", + "dashboard.manual_block.ip_label": "IPアドレス", + "dashboard.manual_block.ip_placeholder": "例: 88.76.21.123", + "dashboard.manual_block.button": "IPをブロック", + "dashboard.manual_block.confirm": "Jail {jail} でIP {ip} をブロックしますか?", + "dashboard.manual_block.success": "IPのブロックに成功しました", + "dashboard.manual_block.error": "IPのブロック中にエラーが発生しました", + "dashboard.manual_block.jail_required": "Jailを選択してください", + "dashboard.manual_block.ip_required": "IPアドレスを入力してください", + "dashboard.manual_block.invalid_ip": "有効なIPアドレスを入力してください", + "dashboard.banned.show_more": "さらに表示", + "dashboard.banned.show_less": "折りたたむ", + "logs.overview.title": "内部ログ概要", + "logs.overview.subtitle": "Fail2ban-UIがすべてのコネクタにわたって保存したイベント。", + "logs.overview.refresh": "データを更新", + "logs.overview.total_events": "保存済みイベント総数", + "logs.overview.per_server": "サーバーごとのイベント", + "logs.overview.recent_events_title": "最近の保存済みイベント", + "logs.overview.clear_events": "クリア", + "logs.overview.clear_events_confirm": "すべての保存済みブロックイベントが完全に削除されます。統計、インサイト、イベント履歴がゼロにリセットされます。\n\nこの操作は元に戻すことができません。続行しますか?", + "logs.overview.clear_events_success": "すべての保存済みブロックイベントがクリアされました。", + "logs.overview.recent_empty": "保存済みイベントが見つかりませんでした。", + "logs.overview.empty": "まだブロックイベントは記録されていません。", + "logs.overview.open_insights": "インサイトを開く", + "logs.overview.total_today": "今日", + "logs.overview.total_week": "過去7日間", + "logs.overview.per_server_empty": "まだサーバーごとのデータはありません。", + "logs.overview.recent_filtered_empty": "現在のフィルターに一致する保存済みイベントがありません。", + "logs.overview.recent_count_label": "表示中のイベント数", + "logs.overview.load_more": "さらに読み込む", + "logs.overview.country_unknown": "不明", + "logs.overview.last_seen": "最終確認", + "logs.table.server": "サーバー", + "logs.table.count": "回数", + "logs.table.jail": "Jail", + "logs.table.ip": "IP", + "logs.table.time": "時刻", + "logs.table.country": "国", + "logs.table.actions": "操作", + "logs.actions.whois": "Whois", + "logs.actions.logs": "ログ", + "logs.search.label": "イベントを検索", + "logs.search.placeholder": "IP、Jail、サーバーを検索", + "logs.search.country_label": "国", + "logs.search.country_all": "すべての国", + "logs.search.country_unknown": "不明", + "logs.badge.recurring": "繰り返し", + "logs.modal.whois_title": "Whois情報", + "logs.modal.logs_title": "ログ", + "logs.modal.jail": "Jail", + "logs.modal.insights_title": "ブロックインサイト", + "logs.modal.insights_description": "国別分布と繰り返し違反者。", + "logs.modal.insights_countries": "国別ブロック", + "logs.modal.insights_countries_empty": "この期間のブロック記録がありません。", + "logs.modal.insights_countries_hint": "選択した時間帯の主要な発信元。", + "logs.modal.insights_recurring_hint": "Fail2banを繰り返しトリガーするIPアドレス。", + "logs.modal.total_overall_note": "累計ブロック記録", + "logs.modal.total_today_note": "過去24時間", + "logs.modal.total_week_note": "週間アクティビティ", + "logs.modal.insights_recurring": "繰り返しIP", + "logs.modal.insights_recurring_empty": "繰り返しIPは検出されませんでした。", + "logs.modal.threat_map_title": "グローバル脅威マップ", + "logs.modal.threat_map_hint": "ドラッグで回転、スクロールでズーム。", + "logs.modal.threat_map_empty": "地理データがありません。", + "threat.modal.title": "脅威インテリジェンス", + "threat.modal.subtitle": "このIPの脅威インテリジェンスデータ。", + "threat.modal.loading": "脅威インテリジェンスデータを読み込み中...", + "threat.modal.invalid_ip": "無効なIPアドレス", + "threat.modal.error_generic": "脅威インテリジェンスデータを読み込めませんでした。", + "threat.modal.error_http": "脅威インテリジェンスリクエストが失敗しました", + "threat.metric.reputation": "レピュテーション", + "threat.metric.confidence": "信頼度", + "threat.metric.background_noise": "バックグラウンドノイズ", + "threat.metric.overall_score": "総合スコア", + "threat.metric.provider": "プロバイダー", + "threat.metric.risk": "リスク", + "threat.metric.pulses": "Pulses", + "threat.metric.country": "国", + "threat.metric.asn": "ASN", + "threat.metric.abuse_confidence": "アビューズ信頼度", + "threat.metric.total_reports": "総報告数", + "threat.metric.distinct_users": "ユニークユーザー数", + "threat.provider.alienvault": "AlienVault OTX", + "threat.provider.abuseipdb": "AbuseIPDB", + "threat.modal.provider_unknown": "不明なプロバイダー", + "threat.section.overview": "概要", + "threat.section.network_location": "ネットワークと場所", + "threat.section.history_activity": "履歴とアクティビティ", + "threat.section.activity_level": "アクティビティレベル", + "threat.section.pulses": "Pulses", + "threat.section.reports": "レポート", + "threat.section.scores": "スコア", + "threat.section.behaviors": "挙動", + "threat.section.attack_details": "攻撃詳細", + "threat.section.classifications": "分類", + "threat.section.mitre": "MITREテクニック", + "threat.section.references": "参考文献", + "threat.section.cves": "CVEs", + "threat.section.target_countries": "対象国", + "threat.field.ip": "IP", + "threat.field.type": "タイプ", + "threat.field.asn": "ASN", + "threat.field.as_name": "AS名", + "threat.field.proxy_vpn": "Proxy/VPN", + "threat.field.reverse_dns": "逆引きDNS", + "threat.field.ip_range": "IP範囲", + "threat.field.ip_range_24": "/24範囲", + "threat.field.country": "国", + "threat.field.city": "都市", + "threat.field.isp": "ISP", + "threat.field.domain": "ドメイン", + "threat.field.usage_type": "使用タイプ", + "threat.field.whitelisted": "ホワイトリスト登録済み", + "threat.field.latitude": "緯度", + "threat.field.longitude": "経度", + "threat.field.first_seen": "初回確認", + "threat.field.last_seen": "最終確認", + "threat.field.full_age": "経過期間", + "threat.field.days_age": "経過日数", + "threat.field.continent": "大陸", + "threat.field.accuracy_radius": "精度半径", + "threat.field.subdivision": "地域", + "threat.field.validation_source": "ソース", + "threat.field.validation_name": "ルール", + "threat.field.industries": "業界", + "threat.field.adversary": "敵対者", + "threat.field.malware_families": "マルウェアファミリー", + "threat.field.ip_version": "IPバージョン", + "threat.field.public_ip": "パブリックIP", + "threat.field.tor": "Tor出口ノード", + "threat.field.hostnames": "ホスト名", + "threat.field.reporter": "報告者", + "threat.field.reporter_id": "報告者ID", + "threat.field.categories": "カテゴリ", + "threat.field.tlp": "TLP", + "threat.field.author": "著者", + "threat.field.subscribers": "購読者", + "threat.field.indicators": "インジケーター", + "threat.field.tags": "タグ", + "threat.section.validation": "検証", + "threat.section.related_context": "関連コンテキスト", + "threat.score.overall": "全体", + "threat.score.last_day": "前日", + "threat.score.last_week": "前週", + "threat.score.last_month": "前月", + "threat.empty.list": "データがありません。", + "threat.empty.target_countries": "対象国データがありません。", + "threat.boolean.yes": "はい", + "threat.boolean.no": "いいえ", + "filter_debug.title": "フィルタデバッグ", + "filter_debug.select_filter": "フィルタを選択", + "filter_debug.filter_content": "フィルタ内容", + "filter_debug.filter_content_hint": "以下のフィルタ正規表現をテスト用に編集してください。変更は一時的なものであり保存されません。", + "filter_debug.filter_content_hint_readonly": "フィルタ内容は読み取り専用で表示されています。テスト用に変更するには「編集」をクリックしてください。変更は一時的なものであり保存されません。", + "filter_debug.edit_filter": "編集", + "filter_debug.cancel_edit": "キャンセル", + "filter_debug.log_lines": "ログ行", + "filter_debug.log_lines_placeholder": "ここにログ行を入力...", + "filter_debug.test_filter": "フィルタをテスト", + "filter_debug.test_results_title": "テスト結果", + "filter_debug.no_matches": "一致する結果がありません。", + "settings.title": "設定", + "settings.general": "一般設定", + "settings.language": "言語", + "settings.server_port": "サーバーポート", + "settings.server_port_placeholder": "例: 8080", + "settings.port_env_set": "ポートはPORT環境変数で設定されています:", + "settings.port_env_hint": "Web UIでポートを変更するには、PORT環境変数を削除してコンテナを再起動してください。", + "settings.port_restart_hint": "⚠️ ポート変更を反映するにはコンテナの再起動が必要です。", + "settings.enable_debug": "デバッグログを有効化", + "settings.enable_console": "コンソール出力を有効化", + "settings.console.title": "コンソール出力", + "settings.console.clear": "クリア", + "settings.console.save_hint": "設定を保存するとここにログが表示されます。", + "settings.alert": "アラート設定", + "settings.callback_url": "Fail2ban コールバックURL", + "settings.callback_url_placeholder": "http://127.0.0.1:8080", + "settings.callback_url_hint": "このURLはすべてのFail2Banインスタンスがブロック通知をFail2Ban UIに送信する際に使用します。ローカル環境ではFail2Ban UIと同じポートを使用してください(例: http://127.0.0.1:8080)。リバースプロキシ環境ではTLS暗号化エンドポイントを使用してください(例: https://fail2ban.example.com)。", + "settings.callback_url_env_set": "コールバックURLはCALLBACK_URL環境変数で設定されています:", + "settings.callback_url_env_hint": "Web UIでコールバックURLを変更するには、CALLBACK_URL環境変数を削除してコンテナを再起動してください。", + "settings.callback_secret": "Fail2ban コールバックURLシークレット", + "settings.callback_secret_placeholder": "自動生成された42文字のシークレット", + "settings.callback_secret.description": "このシークレットはブロックAPIリクエストの認証に使用されます。fail2banアクション設定に自動的に追加されます。", + "settings.destination_email": "送信先メール(アラート受信者)", + "settings.destination_email_placeholder": "alerts@swissmakers.ch", + "settings.alert_countries": "アラート対象国", + "settings.alert_countries_description": "ブロックが発動した際にメールアラートを受け取りたい国を選択してください。", + "settings.alerts": "アラート設定", + "settings.alerts_for_bans": "ブロック時のアラートを有効化", + "settings.alerts_for_unbans": "ブロック解除時のアラートを有効化", + "settings.alert_provider": "アラートプロバイダー", + "settings.alert_provider_email": "メール(SMTP)", + "settings.alert_provider_webhook": "Webhook", + "settings.alert_provider_elasticsearch": "Elasticsearch", + "settings.threat_intel.title": "脅威インテリジェンス", + "settings.threat_intel.provider": "脅威インテリジェンスプロバイダー", + "settings.threat_intel.provider_none": "なし(無効)", + "settings.threat_intel.provider_alienvault": "AlienVault OTX", + "settings.threat_intel.provider_abuseipdb": "AbuseIPDB", + "settings.threat_intel.provider_hint": "選択したプロバイダーが脅威インテリジェンスモーダルに使用されます。", + "settings.threat_intel.alienvault_api_key": "AlienVault APIキー", + "settings.threat_intel.alienvault_api_key_hint": "AlienVaultアカウントのプロフィールでOTXキーを作成してください。", + "settings.threat_intel.abuseipdb_api_key": "AbuseIPDB APIキー", + "settings.threat_intel.abuseipdb_api_key_hint": "AbuseIPDBアカウント設定でAPIキーを生成してください。", + "settings.webhook.title": "Webhook設定", + "settings.webhook.url": "Webhook URL", + "settings.webhook.url_placeholder": "https://my-ntfy-server/fail2ban-topic", + "settings.webhook.method": "HTTPメソッド", + "settings.webhook.headers": "カスタムヘッダー", + "settings.webhook.headers_placeholder": "Authorization: Bearer your-token", + "settings.webhook.headers_hint": "Key: Value形式で1行1ヘッダー。", + "settings.webhook.skip_tls": "TLS証明書の検証をスキップ", + "settings.webhook.test": "テストWebhookを送信", + "settings.webhook.test_hint": "テストの前にWebhook設定を保存してください。", + "settings.elasticsearch.title": "Elasticsearch設定", + "settings.elasticsearch.url": "Elasticsearch URL", + "settings.elasticsearch.url_placeholder": "https://elasticsearch.example.com:9200", + "settings.elasticsearch.index": "インデックス名", + "settings.elasticsearch.index_placeholder": "fail2ban-events", + "settings.elasticsearch.index_hint": "インデックスライフサイクル管理のため日付サフィックス(-YYYY.MM.DD)が自動付加されます。", + "settings.elasticsearch.api_key": "APIキー", + "settings.elasticsearch.api_key_placeholder": "Base64エンコードされたAPIキー", + "settings.elasticsearch.api_key_hint": "推奨認証方法。空欄にするとユーザー名/パスワードを使用します。", + "settings.elasticsearch.username": "ユーザー名", + "settings.elasticsearch.username_placeholder": "elastic", + "settings.elasticsearch.password": "パスワード", + "settings.elasticsearch.skip_tls": "TLS証明書の検証をスキップ", + "settings.elasticsearch.test": "接続テスト", + "settings.elasticsearch.test_hint": "テストの前にElasticsearch設定を保存してください。", + "settings.elasticsearch.help_title": "Elasticsearchセットアップガイド", + "settings.elasticsearch.help_template_title": "1. インデックステンプレートを作成", + "settings.elasticsearch.help_template_desc": "Kibana Dev ToolsまたはAPIを使用してインデックステンプレートを作成し、Elasticsearchがすべてのフィールドを正しくマッピングできるようにします。テンプレートにはコアイベントフィールド、拡張ログフィールド(HTTP、SSHなど)、解析済みWHOISフィールドが含まれます:", + "settings.elasticsearch.help_doc_title": "2. ドキュメント構造", + "settings.elasticsearch.help_doc_desc": "Fail2ban-UIは自動ログおよびWHOISエンリッチメントを備えたECS互換ドキュメントを送信します。ログ行はgrokパターン(Apache、Nginx、sshd、Postfixなど)で解析され、WHOISテキストは構造化フィールドに抽出されます。各イベントはfail2ban-events-YYYY.MM.DDにインデックスされます:", + "settings.elasticsearch.help_auth_title": "3. 認証", + "settings.elasticsearch.help_auth_desc": "APIキー(推奨)またはfail2ban-events-*インデックスへの書き込み権限を持つユーザーのベーシック認証を使用してください。Kibanaの「スタック管理」→「APIキー」でAPIキーを作成します。", + "settings.elasticsearch.help_savetest_title": "4. 保存とテスト", + "settings.elasticsearch.help_savetest_desc": "Fail2ban-UIの設定を保存し、テストボタンをクリックしてElasticsearchへの接続をテストします。(fail2ban-events-*インデックスが作成され、最初のイベントが取り込まれます。)", + "settings.elasticsearch.help_dataview_title": "5. Kibanaデータビュー", + "settings.elasticsearch.help_dataview_desc": "Kibanaで「スタック管理」→「データビュー」→「データビューを作成」に移動します。名前とインデックスパターンにfail2ban-events-*を使用し、時間フィールドとして@timestampを選択します。", + "settings.elasticsearch.help_review_title": "6. データの確認", + "settings.elasticsearch.help_review_desc": "Kibanaで「Discover」に移動し、fail2ban-events-*インデックスを選択すると最初のイベントが表示されます。", + "settings.smtp": "SMTP設定", + "settings.smtp_host": "SMTPホスト", + "settings.smtp_host_placeholder": "例: smtp.gmail.com", + "settings.smtp_port": "SMTPポート", + "settings.smtp_port_placeholder": "587", + "settings.smtp_port_hint": "一般的なポート: 25(平文)、587(STARTTLS)、465(SMTPS)、2525(代替STARTTLS)", + "settings.smtp_auth_method": "認証方法", + "settings.smtp_auth_method_auto": "自動(LOGINを優先)", + "settings.smtp_auth_method_login": "LOGIN", + "settings.smtp_auth_method_plain": "PLAIN", + "settings.smtp_auth_method_cram_md5": "CRAM-MD5", + "settings.smtp_auth_method_hint": "Office365/GmailにはLOGINを推奨。PLAINは標準SMTP認証。CRAM-MD5はチャレンジレスポンス型。", + "settings.smtp_insecure_skip_verify": "TLS証明書の検証をスキップ", + "settings.smtp_insecure_skip_verify_warning": "本番環境には非推奨", + "settings.smtp_username": "SMTPユーザー名", + "settings.smtp_username_placeholder": "例: user@example.com", + "settings.smtp_password": "SMTPパスワード", + "settings.smtp_password_placeholder": "SMTPパスワードを入力", + "settings.smtp_sender": "送信元メール", + "settings.smtp_sender_placeholder": "noreply@swissmakers.ch", + "settings.smtp_tls": "TLSを使用(推奨)", + "settings.send_test_email": "テストメールを送信", + "settings.send_test_email_hint": "テストメールを送信する前にSMTP設定を保存してください。", + "settings.fail2ban": "グローバルデフォルトFail2Ban設定", + "settings.fail2ban.description": "これらの設定はすべての有効なFail2Banサーバーに適用され、jail.local [DEFAULT]セクションに保存されます。", + "settings.enable_bantime_increment": "バンタイム増加を有効化", + "settings.enable_bantime_increment.description": "有効にすると、バンタイムは次の式で計算されます: bantime = findtime * (失敗回数 / maxretry) * (1 + bantime.rndtime)。", + "settings.default_jail_enable": "デフォルトでJailを有効化", + "settings.default_jail_enable.description": "有効にすると、すべてのJailがデフォルトで有効になります。無効の場合、Jailを明示的に有効化する必要があります。", + "settings.default_bantime": "デフォルトバンタイム", + "settings.default_bantime.description": "ホストがブロックされる時間。時間形式: 1m=1分、1h=1時間、1d=1日、1w=1週間、1mo=1ヶ月、1y=1年。", + "settings.default_bantime_placeholder": "例: 48h", + "settings.bantime_rndtime": "バンタイムランダム時間", + "settings.bantime_rndtime.description": "任意。バンタイム増加式に加算される最大ランダム秒数(例: 2048)。空欄にするとFail2banデフォルトを使用。", + "settings.bantime_rndtime_placeholder": "例: 2048", + "settings.default_chain": "デフォルトチェーン", + "settings.default_chain.description": "ブロックに使用するiptables/nftablesチェーン(例: ホストの場合はINPUT、Dockerコンテナの場合はDOCKER-USER)。", + "settings.chain_help_title": "デフォルトチェーン", + "settings.chain_docker_user": "DOCKER-USER", + "settings.chain_help_docker_user": "Docker上で動作するアプリ用。ホスト上のすべてのコンテナにブロックが適用されます。", + "settings.chain_input": "INPUT", + "settings.chain_help_input": "ホスト上のアプリ用。ブロックはホストネットワークにのみ適用され、Dockerネットワークには影響しません。", + "settings.chain_forward": "FORWARD", + "settings.chain_help_forward": "DOCKER-USERが利用できない古いDocker環境向け。", + "settings.banaction": "バンアクション", + "settings.banaction.description": "デフォルトのブロックアクション(例: nftables-multiport、nftables-allports、firewallcmd-rich-rulesなど)。action_*変数を定義するために使用されます。", + "settings.banaction_allports": "バンアクション Allports", + "settings.banaction_allports.description": "すべてのポートに対するブロックアクション(例: nftables-allports、firewallcmd-allportsなど)。特定ポートではなく全ポートをブロックする必要があるJailで使用。", + "settings.default_findtime": "デフォルト検出時間", + "settings.default_findtime.description": "ホストが'findtime'以内に'maxretry'回失敗するとブロックされます。時間形式: 1m=1分、1h=1時間、1d=1日、1w=1週間、1mo=1ヶ月、1y=1年。", + "settings.default_findtime_placeholder": "例: 30m", + "settings.default_max_retry": "デフォルト最大リトライ", + "settings.default_max_retry.description": "ホストがブロックされるまでの失敗回数。", + "settings.default_max_retry_placeholder": "最大リトライ回数を入力", + "settings.geoip_provider": "GeoIPプロバイダー", + "settings.geoip_provider.description": "GeoIPルックアッププロバイダーを選択してください。MaxMindはローカルデータベースファイルが必要で、Built-inは無料のオンラインAPIを使用します。", + "settings.geoip_provider.maxmind": "MaxMind(ローカルデータベース)", + "settings.geoip_provider.builtin": "Built-in(ip-api.com)", + "settings.geoip_database_path": "GeoIPデータベースパス", + "settings.geoip_database_path.description": "MaxMind GeoLite2-Countryデータベースファイルへのパス。", + "settings.max_log_lines": "最大ログ行数", + "settings.max_log_lines.description": "ブロック通知に含める最大ログ行数。最も関連性の高い行が自動的に選択されます。", + "settings.ignore_ips": "無視するIP", + "settings.ignore_ips.description": "スペース区切りのIPアドレス、CIDRマスク、またはDNSホストのリスト。このリストに一致するホストはFail2banでブロックされません。", + "settings.ignore_ips_placeholder": "無視するIP(スペース区切り)", + "settings.advanced.title": "繰り返し違反者に対する高度なアクション", + "settings.advanced.description": "繰り返し違反者を外部ファイアウォールまたはブロックリストに自動同期します。", + "settings.advanced.refresh_log": "ログを更新", + "settings.advanced.test_button": "手動ブロック / テスト", + "settings.advanced.enable": "自動永久ブロックを有効化", + "settings.advanced.threshold": "永久ブロックまでの閾値", + "settings.advanced.threshold_hint": "IPがこの回数のブロックに達すると統合に転送されます。", + "settings.advanced.integration": "統合", + "settings.advanced.integration_none": "統合を選択", + "settings.advanced.integration_hint": "永久ブロックを作成するファイアウォールまたはアプライアンスを選択してください。", + "settings.advanced.mikrotik.note": "MikrotikルーターへのSSHアクセスと、ブロック済みIPを含むアドレスリストを指定してください。", + "settings.advanced.mikrotik.host": "ホスト", + "settings.advanced.mikrotik.port": "ポート", + "settings.advanced.mikrotik.username": "SSHユーザー名", + "settings.advanced.mikrotik.password": "SSHパスワード", + "settings.advanced.mikrotik.key": "SSHキーパス(任意)", + "settings.advanced.mikrotik.list": "アドレスリスト名", + "settings.advanced.pfsense.note": "pfSense REST APIパッケージが必要です。APIキーと管理対象エイリアスを入力してください。", + "settings.advanced.pfsense.install_link": "REST APIパッケージをインストール", + "settings.advanced.pfsense.api_key_setup": "APIキーを設定", + "settings.advanced.pfsense.base_url": "ベースURL", + "settings.advanced.pfsense.token": "APIキー", + "settings.advanced.pfsense.token_hint": "pfSense webConfiguratorの「System > REST API > Keys」で生成", + "settings.advanced.pfsense.alias": "エイリアス名", + "settings.advanced.pfsense.skip_tls": "TLS検証をスキップ(自己署名)", + "settings.advanced.opnsense.note": "OPNsense APIの認証情報と管理対象エイリアスを入力してください。", + "settings.advanced.opnsense.api_docs": "APIドキュメント", + "settings.advanced.opnsense.api_key_setup": "APIキーを設定", + "settings.advanced.opnsense.base_url": "ベースURL", + "settings.advanced.opnsense.key": "APIキー", + "settings.advanced.opnsense.key_hint": "「System > Access > Users > API Keys」で生成", + "settings.advanced.opnsense.secret": "APIシークレット", + "settings.advanced.opnsense.secret_hint": "APIキーと同時に生成", + "settings.advanced.opnsense.alias": "エイリアス名", + "settings.advanced.opnsense.skip_tls": "TLS検証をスキップ(自己署名)", + "settings.advanced.log_title": "永久ブロックログ", + "settings.advanced.clear_log": "クリア", + "settings.advanced.clear_log_confirm": "ブロックログ全体が完全に削除されます。Fail2ban UIは外部ファイアウォール上でIPがブロックされていないとみなします。\n\nこの操作は元に戻すことができません。続行しますか?", + "settings.advanced.clear_log_success": "永久ブロックログがクリアされました。", + "settings.advanced.log_empty": "まだ永久ブロックは記録されていません。", + "settings.advanced.log_ip": "IP", + "settings.advanced.log_integration": "統合", + "settings.advanced.log_status": "ステータス", + "settings.advanced.log_message": "メッセージ", + "settings.advanced.log_server": "サーバー", + "settings.advanced.log_updated": "更新日時", + "settings.advanced.log_actions": "操作", + "settings.advanced.unblock_btn": "削除", + "settings.advanced.test_title": "手動ブロック / テスト", + "settings.advanced.test_ip": "IPアドレス", + "settings.advanced.test_server": "任意のサーバー", + "settings.advanced.test_server_none": "グローバル統合設定を使用", + "settings.advanced.test_block": "IPをブロック", + "settings.advanced.test_unblock": "IPを削除", + "settings.save": "保存", + "modal.filter_config": "フィルタ / Jail設定:", + "modal.filter_config_edit": "フィルタ / Jailを編集", + "modal.filter_config_label": "フィルタ設定", + "modal.filter_config_hint": "空のままにすると、空のフィルタファイルが作成されます。", + "modal.filter_name": "フィルタ名", + "modal.filter_name_hint": "英数字、ハイフン、アンダースコアのみ使用可能です。", + "modal.jail_config": "Jail設定", + "modal.jail_config_hint": "フィルタを選択すると、Jail設定が自動入力されます。", + "modal.jail_config_label": "Jail設定", + "modal.jail_filter": "フィルタ(任意)", + "modal.jail_filter_hint": "フィルタを選択するとJail設定が自動入力されます。", + "modal.jail_name": "Jail名", + "modal.jail_name_hint": "英数字、ハイフン、アンダースコアのみ使用可能です。", + "modal.test_logpath": "ログパスのテスト", + "modal.local_server_logpath_note": "⚠️ 注意:", + "modal.local_server_logpath_text_prefix": "ローカルのfail2banサーバー(例: コンテナホストシステムやコンテナ内にインストール)の場合、ログファイルもfail2ban-uiコンテナにマウントする必要があります(例:", + "modal.local_server_logpath_text_suffix": ")これはJailを更新する際にfail2ban-uiがログパス変数やパスを確認できるようにするために必要です。", + "modal.create": "作成", + "modal.create_filter": "新規フィルタを作成", + "modal.create_filter_title": "新規フィルタを作成", + "modal.create_jail": "新規Jailを作成", + "modal.create_jail_title": "新規Jailを作成", + "modal.cancel": "キャンセル", + "modal.save": "保存", + "modal.close": "閉じる", + "loading": "読み込み中...", + "dashboard.manage_jails": "Jailを管理", + "modal.manage_jails_title": "Jailを管理", + "servers.selector.label": "アクティブサーバー", + "servers.selector.empty": "サーバーが未設定", + "servers.selector.none": "サーバーが設定されていません。Fail2banサーバーを追加してください。", + "servers.modal.title": "Fail2banサーバーを管理", + "servers.modal.description": "リモートFail2banインスタンスを登録し、UIの接続方法を選択します。", + "servers.modal.list_title": "登録済みサーバー", + "servers.modal.list_empty": "まだサーバーが設定されていません。右側のフォームから最初のFail2banサーバーを追加してください。", + "servers.modal.info_title": "サーバー管理", + "servers.modal.info_body": "リストから既存のサーバーを編集するか、上のボタンをクリックして新しいコネクタを作成してください。", + "servers.modal.form_title": "サーバーを追加または更新", + "servers.form.name": "表示名", + "servers.form.name_placeholder": "私のFail2banサーバー", + "servers.form.type": "接続タイプ", + "servers.type.local": "ローカル(同一ホスト)", + "servers.type.ssh": "SSH", + "servers.type.agent": "APIエージェント", + "servers.form.host": "ホスト名 / IP", + "servers.form.host_placeholder": "fail2ban.example.com", + "servers.form.port": "ポート", + "servers.form.port_placeholder": "22", + "servers.form.socket_path": "Fail2banソケットパス", + "servers.form.socket_path_placeholder": "/var/run/fail2ban/fail2ban.sock", + "servers.form.config_path": "Fail2ban設定マウントパス", + "servers.form.config_path_placeholder": "/etc/fail2ban-secondary", + "servers.form.config_path_help": "追加ローカルコネクタに必須。一意であり、コンテナのマウント先と一致する必要があります。", + "servers.form.log_path": "Fail2banログパス", + "servers.form.hostname": "サーバーホスト名", + "servers.form.hostname_placeholder": "任意", + "servers.form.ssh_user": "SSHユーザー", + "servers.form.ssh_user_placeholder": "sa_fail2ban", + "servers.form.ssh_key": "SSH秘密鍵パス", + "servers.form.ssh_key_placeholder": "/config/.ssh/id_rsa", + "servers.form.ssh_key_help": "/config/.ssh/ディレクトリにSSH秘密鍵を配置してください(マウントされた設定ボリューム)。鍵ファイルのパーミッションは600(chmod 600)が必要です。例: /config/.ssh/id_rsa", + "servers.form.agent_url": "エージェントURL", + "servers.form.agent_url_placeholder": "https://host:9700", + "servers.form.agent_secret": "エージェントシークレット", + "servers.form.agent_secret_placeholder": "共有シークレットトークン", + "servers.form.tags": "タグ", + "servers.form.tags_placeholder": "カンマ区切りのタグ", + "servers.form.set_default": "デフォルトサーバーに設定", + "servers.form.enabled": "コネクタを有効化", + "servers.form.submit": "サーバーを保存", + "servers.form.reset": "リセット", + "servers.form.new_server": "新規サーバー", + "servers.form.success": "サーバーが正常に保存されました。", + "servers.badge.default": "デフォルト", + "servers.badge.enabled": "有効", + "servers.badge.disabled": "無効", + "servers.badge.restart_needed": "再起動が必要", + "servers.actions.edit": "編集", + "servers.actions.set_default": "デフォルトに設定", + "servers.actions.enable": "有効化", + "servers.actions.disable": "無効化", + "servers.actions.test": "接続テスト", + "servers.actions.test_success": "接続成功", + "servers.actions.test_failure": "接続失敗", + "servers.jail_local_warning": "警告: jail.localはFail2ban-UIで管理されていません。各Jailをjail.d/以下の個別ファイルに移動し、jail.localを削除してFail2ban-UIが再作成できるようにしてください(設定ページで一度保存してください)。権限についてはドキュメントを参照してください。", + "servers.actions.restart": "Fail2banを再起動", + "servers.actions.reload": "Fail2banをリロード", + "servers.actions.reload_tooltip": "ローカルコネクタでは、ソケット接続経由での設定リロードのみ可能です。コンテナはsystemctlを使用してFail2banサービスを再起動できません。完全な再起動を行うには、ホストシステムで直接「systemctl restart fail2ban」を実行してください。", + "servers.actions.delete": "削除", + "servers.actions.delete_confirm": "このサーバーエントリを削除しますか?", + "servers.form.select_key": "秘密鍵を選択", + "servers.form.select_key_placeholder": "手動入力", + "servers.form.no_keys": "SSHキーが見つかりません。パスを手動で入力してください", + "servers.validation.name_required": "サーバー名は必須です。", + "servers.validation.duplicate_name": "この名前のサーバーが既に存在します。", + "servers.validation.duplicate_socket": "このソケットパスを持つローカルコネクタが既に存在します。", + "servers.validation.duplicate_config_path": "この設定パスを持つローカルコネクタが既に存在します。", + "servers.validation.agent_required": "APIエージェントサーバーにはエージェントURLとエージェントシークレットが必須です。", + "servers.card.socket_path": "ソケットパス", + "servers.card.config_path": "設定パス", + "servers.card.server_id": "サーバーID", + "filter_debug.not_available": "フィルタデバッグは少なくとも1つの登録済みFail2banサーバーが有効な場合にのみ利用できます。", + "filter_debug.local_missing": "このホスト上でローカルFail2banフィルタディレクトリが見つかりませんでした。", + "filter_debug.save_success": "フィルタとJail設定が保存され、リロードされました", + "filter_debug.save_reload_warning": "設定は保存されましたが、fail2banのリロードに失敗しました", + "filter_debug.jail_auto_disabled": "Jail '%s' が自動的に無効化されました。", + "email.ban.title": "セキュリティアラート: Fail2Banが新しいIPアドレスをブロックしました", + "email.ban.intro": "Fail2Ban-UIが不正なリクエストまたは繰り返しの認証失敗を検出し、送信元IPを自動的にブロックしました。以下のメタデータとログ抜粋を確認してください。", + "email.ban.subject.banned": "ブロック済み", + "email.ban.subject.from": "から", + "email.ban.details.banned_ip": "ブロック済みIP", + "email.ban.details.jail": "Jail", + "email.ban.details.hostname": "ホスト名", + "email.ban.details.failed_attempts": "失敗試行回数", + "email.ban.details.country": "国", + "email.ban.details.timestamp": "タイムスタンプ", + "email.ban.whois_title": "WHOIS情報", + "email.ban.logs_title": "関連ログ抜粋", + "email.test.title": "メール配信テスト", + "email.test.intro": "このメッセージはSMTP設定が正しく機能しており、HTML形式のメールを送信できることを確認します。", + "email.test.subject": "Fail2Ban UIからのテストメール", + "email.test.details.recipient": "受信者", + "email.test.details.smtp_host": "SMTPホスト", + "email.test.details.triggered_at": "トリガー日時", + "email.test.whois_no_data": "テストメールではWHOISルックアップは実行されません。", + "email.test.sample_logs": "2025-01-01T12:00:00Z Sample log entry of Fail2ban-UI.", + "email.whois.no_data": "このイベントのWHOISデータは取得されませんでした。", + "email.logs.no_data": "このブロックのログエントリは取得されませんでした。", + "email.footer.text": "このメッセージはFail2Ban-UIによって自動的に生成されました", + "email.unban.title": "IPアドレスがブロック解除されました", + "email.unban.intro": "Fail2Ban JailからIPアドレスのブロックが解除されました。", + "email.unban.subject.unbanned": "ブロック解除済み", + "email.unban.subject.from": "から", + "email.unban.details.unbanned_ip": "ブロック解除済みIP", + "email.unban.details.jail": "Jail", + "email.unban.details.hostname": "ホスト名", + "email.unban.details.country": "国", + "email.unban.details.timestamp": "タイムスタンプ", + "lotr.email.title": "闇の使者が追放されました", + "lotr.email.intro": "中つ国の守護者たちが脅威を察知し、それを領域から追放しました。", + "lotr.email.you_shall_not_pass": "お前は通れない", + "lotr.email.footer": "サーバーが守られますように。すべてを支配する一つのBan。", + "lotr.email.details.dark_servant_location": "闇の使者の場所", + "lotr.email.details.realm_protection": "保護の領域", + "lotr.email.details.origins": "発信元:", + "lotr.email.details.banished_at": "追放日時:", + "lotr.email.unban.title": "拘束された囚人が解放されました", + "lotr.email.unban.intro": "中つ国の守護者たちが領域へのアクセスを回復しました。", + "lotr.email.unban.details.restored_ip": "解放されたIP", + "lotr.banished": "領域から追放", + "lotr.realms_protected": "保護された領域", + "lotr.threats_banished": "追放された脅威", + "toast.ban.title": "新しいブロックが発生しました", + "toast.ban.action": "でブロック", + "toast.unban.title": "IPのブロック解除", + "toast.unban.action": "からブロック解除", + "auth.login_title": "Fail2ban UIにサインイン", + "auth.login_description": "管理インターフェースにアクセスするには認証してください", + "auth.login_button": "OIDCでサインイン", + "auth.logging_in": "ログインにリダイレクト中...", + "auth.logout": "ログアウト", + "auth.user_info": "ユーザー情報", + "auth.session_expired": "セッションが期限切れです。再度ログインしてください。", + "auth.login_required": "認証が必要です", + "footer.version": "Fail2ban-UI v{version}", + "footer.latest": "最新", + "footer.update_available": "アップデートあり: v{version}" +} From 810688893a11a19f80e28e11d4d3ae28e8783f1c Mon Sep 17 00:00:00 2001 From: m4549071758 Date: Sat, 16 May 2026 12:52:22 +0900 Subject: [PATCH 5/5] fix: meta.language_name --- pkg/web/locales/ja.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/web/locales/ja.json b/pkg/web/locales/ja.json index 97bc0ca..4f73065 100644 --- a/pkg/web/locales/ja.json +++ b/pkg/web/locales/ja.json @@ -1,5 +1,5 @@ { - "meta.language_name": "日本語", + "meta.language_name": "japanese", "page.title": "Fail2ban UI ダッシュボード", "nav.dashboard": "ダッシュボード", "nav.filter_debug": "フィルタのデバッグ",