【Docker】プロジェクト管理ツールを自前で立てる話と、AIにコードを書かせてハマった話

プロジェクト管理ツールといえば、Jira、Backlog、Notionなど、今はクラウド型が主流です。
クラウド型の最大のメリットは、インフラの管理を自分たちでしなくて良いこと。月額料金を払えば、アップデートもハードウェア構成も気にせず、招待機能を活用して外部パートナーともスムーズに連携できます。

しかし、個人的には「オンプレミスのRedmine」も捨てがたい選択肢だと思っています。

なぜ今さらオンプレ(Redmine)なのか

理由は単純で、「コスト」と「身軽さ」です。
私は基本的に「予算がない」「一人、あるいは少人数」「ビジネス上の費用対効果がシビア」という環境で動くことが多いため、どうしてもOSS(オープンソース)を検討してしまいます。

社内やチーム内だけで使うなら、高価なクラウドやハイスペックなVPSは不要。手元の仮想マシンや安価なサーバーにRedmineを入れれば、ランニングコストはほぼサーバー代だけで済みます。

セキュリティ対策:「Windows Serverを使わない」

自前でサーバーを立てるというと「セキュリティはどうするんだ」という話になりますが、これについては私の持論があります。

「Windows Serverを使わず、Linuxを使っておけば、とりあえずの解決策になる」

これが私の考えです。

Windows Serverを使っていると、どうしても攻撃の対象になりやすく、対策が必須になります。特にRDP(リモートデスクトップ)などは、インターネットに公開していれば秒単位で総当たり攻撃を受けますし、OS自体の脆弱性も頻繁に見つかります。つまり、Windowsを選んだ時点で「守りを固めなければならない」というハンデを背負っている状態です。

一方で、Linux(CUI)であれば、そもそもRDPのような攻撃されやすい入り口がありません。
「Linuxを選べば、Windowsよりも被害が少ないし、セキュリティのスタートラインが違う」
のです。

さらに言えば、RedmineはRuby製です。WordPressのようなPHP製のCMSに比べれば、脆弱性を突かれる頻度も低いです。「Linux × Docker × ローカルIP接続」という構成であれば、そこまで過剰なセキュリティ意識(MFAや複雑なパスワード要件など)を持たずとも、必要十分な安全性を確保できると考えています。

Docker構築とAIの落とし穴

構築にはDockerを使います。自前でRubyの環境構築をするのは面倒ですが、Dockerなら公式イメージがあります。
docker-compose.yml を自分で書くのも手間なので、AIに「とりあえず動くコード」を生成してもらいました。

AIが生成したコード

services:
  redmine:
    image: redmine:latest
    container_name: redmine-app
    ports:
      - "3000:3000"
    environment:
      - REDMINE_DB_MYSQL=db
      - REDMINE_DB_PASSWORD=secret
      - REDMINE_DB_USERNAME=redmine
      - REDMINE_DB_DATABASE=redmine
      - REDMINE_SECRET_KEY_BASE=secret_key_base
      - TZ=Asia/Tokyo
      - RAILS_LOG_TO_STDOUT=false
      - REDMINE_LOG_LEVEL=debug
    volumes:
      - ./data/files:/usr/src/redmine/files
      - ./data/log:/usr/src/redmine/log
      - ./data/themes:/usr/src/redmine/public/themes
    depends_on:
      - db
    restart: always

  db:
    image: mysql:8.4
    container_name: redmine-mysql
    command: 
      - --mysql-native-password=ON
      - --innodb_use_native_aio=0
    environment:
      - MYSQL_ROOT_PASSWORD=secret
      - MYSQL_DATABASE=redmine
      - MYSQL_USER=redmine
      - MYSQL_PASSWORD=secret
      - TZ=Asia/Tokyo
    volumes:
      - db-data:/var/lib/mysql
    restart: always

volumes:
  db-data:

一見よさそうに見えますが、これには大きな罠がありました。

AIは間違いを認めない

指定したイメージは redmine:latest ですが、現在の最新版は Redmine 6 です。Redmine 6からはディレクトリ構成が変わり、テーマの配置場所が変更されています。

  • 誤(AIの生成): /usr/src/redmine/public/themes
  • 正(Redmine 6): /usr/src/redmine/themes/

AIに「パスが違うのでは?」と指摘しても最初は間違いを認めず、公式ドキュメント等の情報を突きつけてようやく訂正してきました。AIコードを鵜呑みにせず、バージョン差異のチェックは必須だと痛感しました。

「動けばいい」から「実用」へ

修正後、とりあえず起動はしましたが、実用面を考えると以下の課題が残ります。

  1. メール通知が使えない: 少人数なら無しでも運用可能だが、やっぱり不便。
  2. テーマが古い: デフォルトのままでは味気ない。
  3. ログ管理: 操作ログなどを取得・保存する設定になっていない。

「とりあえず動けばいい」レベルなら上記のコードで十分ですが、後から設定を変更するのは大変です。
次回は、これらの課題を解決し、実用的に使えるコードへブラッシュアップしていきたいと思います。

この記事に関する技術サポート・ご相談

「手順通りにいかない」「自社環境への構築を代行してほしい」など、
インフラ・サーバー周りでハマった際はお気軽にご相談ください。

相談・問い合わせフォームを開く

※ Googleフォームへ移動します(初回相談無料)

個人支援・寄付について

サイトラボでは個人支援・寄付を受けております。ご協力いただける方はお願いいたします。当サイトではビットコインで受け付けております。

  • ビットコイン:3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS