GithubHelp home page GithubHelp logo

isucon / isucon11-portal Goto Github PK

View Code? Open in Web Editor NEW
0.0 0.0 0.0 4.81 MB

License: MIT License

Ruby 30.63% Go 2.68% Shell 0.37% Jsonnet 3.65% Dockerfile 0.18% JavaScript 0.49% CSS 0.09% TypeScript 34.98% SCSS 1.53% HTML 3.46% Rust 4.61% HCL 17.30% Makefile 0.03%

isucon11-portal's Introduction

CAUTION: this project is open for only #isucon administrators

/webapp
/webapp/perl
/webapp/ruby
/webapp/nodejs

/tools
/tools/benchmark
/tools/domchecker
/tools/scoreboard

** Webアプリの基本方針
-処理はすべてリクエストを受け取ってから実施する
--DBへのクエリ
--テンプレートからのレンダリング
-全てのコンテンツをアプリケーションから渡す
--js/css/画像も含めて
-キャッシュ等はとりあえず全て無し

** 実装するリクエストハンドラ
- /
-- GET
-- articleのリスト(投稿順(id順) 最新10個)
--- SELECT id,title,body,created_at FROM article ORDER BY id DESC LIMIT 10

- /article/:articleid
-- GET
-- articleページの表示 (article + comments)
--- SELECT id,title,body,created_at FROM article WHERE id=?
--- SELECT name,body,created_at FROM comment WHERE article=? ORDER BY id

なお全ページ、左側のサイドバーに「新しいコメントがついた順に記事10件」を表示
--- SELECT article FROM comment GROUP BY article ORDER BY created_at DESC LIMIT 10

- /post
-- GET
-- 記事投稿用HTML ただしベンチ対象外のURLとする

- /post
-- POST
-- 記事投稿
-- パラメータはform形式で title, body
--- INSERT INTO article SET ...
-- レスポンスは / へのリダイレクト(成功)、もしくは適当なエラー用のHTTPステータス

- /comment/:articleid
-- POST
-- コメント投稿 (投稿フォームは /article/:articleid の末尾)
-- パラメータはform形式で name, body
--- INSERT INTO comment SET ...
-- レスポンスは /article/:articleid へのリダイレクト(成功)、もしくは適当なエラー用のHTTPステータス

** 添付するstaticファイル

- 画像
-- isuconロゴを適当なサイズにして流用、ページトップのバナー画像にする

- js
-- jquery 最新版の minify 済みファイル
-- jquery-ui 最新版の minify 済みファイル
-- isucon.js デザイン調整用

- css
-- jquery-ui の適当なスタイル用のもの一式
-- isucon.css デザイン調整用

isucon11-portal's People

Contributors

941 avatar buchy avatar fujishigetemma avatar h-kawase avatar iwashi avatar kinmemodoki avatar mahito avatar mirakui avatar motoki317 avatar nana4gonta avatar ockie1729 avatar oribe1115 avatar orisano avatar osumi1125 avatar progfay avatar rosylilly avatar ryoha000 avatar sapphi-red avatar shotakitazawa avatar sorah avatar takahashikazuya avatar takonomura avatar whywaita avatar yfujit avatar yosuke-furukawa avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

isucon11-portal's Issues

portal-dev をデプロイする

本番環境とほぼ同じ動作チェック用環境として portal-dev 環境をデプロイする

  • ElastiCache (Redis)
  • RDS (Aurora)
  • SQS
  • ECS (#23)
  • Route 53 (portal-dev.isucon.net)
  • GitHub, Discord (#11)
  • GitHub Actions (#27)
  • IAM Role (EcsTaskExecution)

hako app

  • isuxportal-dev-discordbot-fargate
  • isuxportal-dev-fargate
  • isuxportal-dev-grpc-fargate (ベンチマーカー用なので参加登録には不要なので後で)
  • isuxportal-dev-worker-fargate

本選開発用環境をデプロイする

本選作問チームが触るポータル環境を作る

  • xi.isucon.dev に作る
  • ログイン用の Discord, GitHub は portal-dev と共有する
    • なので Discord Bot はデプロイしない

チェッカーが送ってきたIPアドレスを ContestantInstance にセットする

POST /api/env_checksnamequalify1, qualify2, qualify3 の時に、それぞれ対応する ContestantInstance にIPアドレスをセットされるようにする。
Private IP については事前に決まってるはずなのでチェッカーからは送らない。
Cloud ID も特に送ってないし、特に使うことも無いともうので適当な値を入れておく? (EC2 のインスタンス ID をチェッカーから貰っても良いかも)


(前回の定例でタスク洗い出しした際には忘れてて抜けてそうだったので Issue 作りました。一旦ポータルアプリ側の他作業も @sapphi-red さんが持ってるので Assign しておきました。)

ポータルの DNS を設定する

本番環境ポータル DNS のレコードを isucon.net に設定してもらうように依頼する (早めにやる)
こっちで作業しやすいように #12 で作成したゾーン内のサブドメインに CNAME する

TLS 証明書のために Amazon Certificate Manager を通すためのレコードも設定してもらう

Failedのときに0点にならない

Failedのときに0点にならないことがあります。
0点: https://portal-dev.isucon.net/admin/benchmark_jobs/130
正の点: https://portal-dev.isucon.net/admin/benchmark_jobs/132

なので、恐らく

  • ベンチ側のバグで、finished=trueが送れていない
  • (b) portalの仕様として、failedした時点で、finished=trueが来ていなくてもベンチを終了させている

のどちらかだと思っています。

(a)や(b)は仕様ですか?

この問題自体はベンチマーク側で解決出来ると思うので、仕様ならそのままで大丈夫です。

チェッカーが1つの AMI しか許容していない

チェッカーがポータルから AMI ID を受け取って、それと一致しているかチェックしている。
競技環境確認で AMI 更新した場合に、ポータルの返す AMI ID も変えるとその前にダウンロードしてた CloudFormation では AMI 不一致としてチェックに失敗するようになる。
当日 AMI 更新が入る可能性は殆ど無いだろうけども、念の為ポータルから許容できる AMI を全て返して、どれかにマッチすればチェックをパスする仕様にしたほうが安全?

本番環境をデプロイする

  1. 必要なリソースを Terraform で作成 (@yfujit)
  • RDS
  • ElastiCache
  • SQS
  • IAM Role
  1. データベース初期化 (@takonomura)
  • 1 の RDS 作成後に行う
  • isuxportal データベースの作成
  • isuxportal ユーザーの作成 & 権限付与
  • Parameter Store に DATABASE_PASSWORD 追加
  1. 外部連携の設定 (@takonomura)
  • GitHub App
    • GitHub App 作成
    • Parameter Store に ISUXPORTAL_GITHUB_CLIENT_{ID,SECRET} 追加
  • Discord App
    • Discord App 作成
    • Discord Bot 作成
    • Parameter Store に ISUXPORTAL_DISCORD_{CLIENT_ID,CLIENT_SECRET,BOT_TOKEN} 追加
  • Discord サーバー
    • Discord サーバーをテンプレートから作成
    • Widget 有効にする (Invite Channel は #readme にする)
    • Discord Bot の追加
      • bot role を付与
  • Slack Incoming Webhook
    • Slack 上で Incoming Webhook 作成
    • Parameter Store に ISUXPORTAL_SLACK_WEBHOOK_URL 追加
  1. 環境変数の変更 & 秘匿値の生成
  • 環境変数 (@yfujit)
    • DATABASE_URL
    • REDIS_URL
    • SENTRY_DSN
    • ISUXPORATAL_FINAL
    • ISUXPORTAL_TIMING_*
    • ISUXPORTAL_TERMS_URL
    • ISUXPORTAL_RULES_URL
    • ISUXPORTAL_DOCS_URL
    • ISUXPORTAL_DISCORD_* (@takonomura)
  • 秘匿値 (@takonomura)
    • SECRET_KEY_BASE
    • ISUXPORTAL_VAPID_PRIVATE_KEY
    • ISUXPORTAL_ADMIN_LOGIN
    • ISUXPORTAL_ADMIN_PASSWORD
    • ISUXPORTAL_BYPASS_SECRET
    • ISUXPORTAL_SSH_KEY_API_SECRET
    • ISUXPORTAL_BENCH_TOKEN
    • ISUXPORTAL_DCIM_TOKEN (不要)
  1. hako deploy (@yfujit)
  • 1~4 が全て完了したあとに行う
  • oneshot で bundle exec rake db:migrate
  • isuxportal-prd-fargate
  • isuxportal-prd-discordbot-fargate
  • isuxportal-prd-worker-fargate
  1. portal.isucon.net 設定 (@yfujit)
  • 先に書いて PR だけ出しといて、 5 の isuxportal-prd-fargate が完了したあとに apply する
  • Route 53
  • CloudFront
  1. 動作チェック
  • 1~6 が全て完了したあとに行う
  • https://portal.isucon.net が開ける
  • admin login ができる
  • GitHub, Discord の認証ができる
  • /admin/slacktown を叩いて Slack に通知が来る
  • Discord Bot がオンラインになっている

競技環境確認のデプロイ

8月13日に行うデプロイの手順確認用

  • AMI をパブリックにする
  • #136 をマージする
  • bundle exec rake db:migrate
  • bundle exec rails runner 'ZONE_IDS = ["apne1-az1", "apne1-az2", "apne1-az4"]; Team.active.each.with_index { |t, i| zone = ZONE_IDS[i % ZONE_IDS.size]; t.update_attributes(availability_zone: zone); puts "#{t.id} #{t.name}: #{zone}"; }'
    • デプロイより先に availability_zone 埋めることで空の状態が選手から見えることを防ぐ
  • hako deploy
  • 本番環境で動作確認
  • Discord でアナウンス

Prometheus 構築

ポータルと同じ VPC 内に Prometheus と Grafana を構築する

  • 構築方法は何でもいい (1つ EC2 インスタンス建てて、 Prometheus と Grafana まとめて動かすとかで良い, Ansible 等使うのが手間であれば手積みでも問題ない)
  • ec2_sd_config で予選ベンチマーカーの node-exporter をターゲットにするので Prometheus に IAM で必要な権限つける
  • Prometheus の設定は後でするので、一旦仮で良い
  • Grafana は外からアクセスできるようにする
    • *.xi.isucon.dev の ACM もあるので、 grafana.xi.isucon.dev とかで ELB 作るのが良さそう
  • Grafana はログイン必須にしておく (anonymous アクセス無効にしておく, デフォルトでなっている気もする)
  • Grafana の Datasource として Prometheus を追加
  • Grafana の Dashboard とかはとりあえず何も作られて無くて良い

「選手」に用語を統一

レギュレーション等では「選手」に統一しているはずなので、「競技参加者向けページ」などポータルで「参加者」などになっている箇所も選手に統一する?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.