無料でビルドを開始
CircleCI.comアカデミーブログコミュニティサポート

外部サービスの設定

9 months ago4 min read
Server v4.x
サーバー管理者
このページの内容

このページでは、CircleCI Server 4.x を新規にインストールする場合、および既存の CircleCI Server 4.x から内部の Postgres および MongoDB のデータを外部データストアに移行する場合に使用する以下の外部サービスの設定方法について説明します。

PostgreSQL

PostgreSQL のベストプラクティス

プライマリで障害が発生した場合の復旧や、バックアップのために、PostgreSQL レプリカは 2 つ以上実行することをお勧めします。 推奨される PostgreSQL マシンの仕様は以下のとおりです。

1 日のアクティブユーザー数PostgreSQL レプリカ数CPURAMディスクNIC 速度

50 名未満

2

8 コア

16 GB

100 GB

1 Gbps

50 ~ 250 名

2

8 コア

16 GB

200 GB

1 Gbps

250 ~ 1000 名

3

8 コア

32 GB

500 GB

10 Gbps

1000 ~ 5000 名

3

8 コア

32 GB

1 TB

10 Gbps

5000 名以上

3

8 コア

32 GB

1 TB

10 Gbps

内部 PostgreSQL から外部ソースへの移行

When a CircleCI server instance is deployed, Postgres is deployed internally by default via its helm chart. However, as an operator, you may wish to externalize this database to have better control over scalability and availability. Once you have configured your external Postgres, you may use the guide below to migrate your Postgres data to your external database.

1. Disable the application

Disable the CircleCI server application by scaling down the application layer pods. No Data is lost in this process, but the application will be unreachable.

Scale down your application layer pods:

namespace=<your-server-namespace>
kubectl -n "$namespace" scale deploy -l "layer=application" --replicas="0"

Running kubectl -n "$namespace" get pods will show most of your pods scaling to down, leaving your database pods running including Postgres.

2. Validate access to your external PostgreSQL from within the cluster (optional)

  1. Confirm that pods within your CircleCI Server cluster can access your external Postgres. You can do this from within your internal Postgres.

    PG_POD=$(kubectl -n "$namespace" get pods | grep postgresql | tail -1 | awk '{print $1}')
    kubectl exec -it -n "$namespace" "$PG_POD" -- bash
  2. While still connected to the pod run:

    psql -h <your-external-postgres-host> -U postgres -p <your-external-postgres-port>

You should be able to connect to your external Postgres at this point. If not, resolve any issues before proceeding.

3. Generate export of your internal PostgreSQL

  1. Retrieve your internal Postgres credentials:

    PG_PASSWORD=$(kubectl -n "$namespace" get secrets postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
  2. Connect to your Postgres pod and perform a Postgres dump:

    kubectl -n "$namespace" exec -it "$PG_POD" -- bash -c "export PGPASSWORD='$PG_PASSWORD' && pg_dumpall -U postgres -c" > circle.sql
  3. Clean up the Postgres Dump. Your internally deployed Postgres uses the username postgres. However, during the restore, the Postgres dump will drop all resources before trying to create new ones, including the postgres user. Access the Postgres pod where the dump is stored and run the following commands on the Postgres dump file to remove the lines that would delete the Postgres user.

    PG_POD=$(kubectl -n "$namespace" get pods | grep postgresql | tail -1 | awk '{print $1}')
    kubectl exec -it -n "$namespace" "$PG_POD" -- bash
    
    sed -i".bak" '/DROP ROLE postgres/d' circle.sql
    sed -i".bak" '/CREATE ROLE postgres/d' circle.sql
    sed -i".bak" '/ALTER ROLE postgres WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS PASSWORD/d' circle.sql

4. Restore your data in your external PostgreSQL

While still connected to your the internally deployed Postgres, restore the dumped data to your external Postgres:

psql -h <your-external-postgres-host> -U postgres -p <your-external-postgres-port> < circle.sql

Now your external Postgres will have your CircleCI server data. In the next section you will update CircleCI server to point to your external Postgres.

外部の PostgreSQL インスタンスを CircleCI Server に接続する

外部の PostgreSQL インスタンスをセットアップしたら、CircleCI Server インスタンスがアクセスできるように、values.yaml ファイルに以下を追加します。

postgresql:
  internal: false
  postgresqlHost: <domain> # The domain or IP address of your PostgreSQL instance
  postgresqlPort: <port> # The port of your PostgreSQL instance

この変更は、helm install/upgrade を実行したときに有効になります。 外部化した Postgres インスタンスへの移行を完了している場合、helm upgrade を実行すると、スケールダウンされたポッドが values.yaml で定義されたレプリカ番号にスケールバックされます。

PostgreSQL のバックアップ

PostgreSQL から、PostgreSQL 12 システムのバックアップと復元に関する公式ドキュメント ( こちら ) が提供されています。

CircleCI では、以下を行っていただくよう強くお勧めしています。

  • 毎日バックアップを行う

  • 少なくとも 30 日分のバックアップを保持する

  • データベースには機密情報が含まれている場合があるので、バックアップには暗号化ストレージを使用する

  • CircleCI Server のアップグレードを行う前には毎回バックアップを行う

MongoDB

内部 MongoDB から外部化ソースへの移行

When a CircleCI server instance deployed, MongoDB is deployed internally by default via its helm chart. However, as an operator, you may wish to externalize this database to have better control over scalability and availability. Once you have configured your external MongoDB, you may use the guide below to migrate your Mongo data to your external database.

1. Disable the application

Disable the CircleCI server application by scaling down the application layer pods. No Data is lost in this process, but the application will be unreachable.

Scale down your application layer pods:

namespace=<your-server-namespace>
kubectl -n "$namespace" scale deploy -l "layer=application" --replicas="0"

Running kubectl -n "$namespace" get pods will show most of your pods scaling to down, leaving your database pods running, including Mongo.

2. Validate access to your external MongoDB from within the cluster (optional)

  1. Confirm that pods within your CircleCI server cluster can access your external MongoDB. You can do this from within your internal MongoDB pod:

    MONGO_POD="mongodb-0"
    kubectl exec -it -n "$namespace" "$MONGO_POD" -- bash
  2. While still connected to the pod run the following:

    mongo --username <username> --password --authenticationDatabase admin --host <external-mongodb-host> --port <external-mongodb-port>

You should be able to connect to your external MongoDB at this point. If not, resolve any issues before proceeding.

3. Generate export of your internal MongoDB

  1. Retrieve your internal MongoDB credentials:

    MONGO_POD="mongodb-0"
    MONGODB_USERNAME="root"
    MONGODB_PASSWORD=$(kubectl -n "$namespace" get secrets mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
  2. Create a backup directory in your MongoDB pod:

    kubectl -n "$namespace" exec "$MONGO_POD" -- mkdir -p /tmp/backups/
  3. Generate a MongoDB database dump to the backup directory you just created:

    kubectl -n "$namespace" exec -it "$MONGO_POD" -- bash -c "mongodump -u '$MONGODB_USERNAME' -p '$MONGODB_PASSWORD' --authenticationDatabase admin --db=circle_ghe --out=/tmp/backups/"

4. Restore your data in your external MongoDB

Use the generated MongoDB backup to restore the data to your external MongoDB:

kubectl -n "$namespace" exec "$MONGO_POD" -- mongorestore --drop -u "$MONGODB_USERNAME" -p "$MONGODB_PASSWORD" --authenticationDatabase admin /tmp/backups/circle_ghe;

Now your external MongoDB will have your CircleCI server data. In the next section you will update CircleCI server to point to your external MongoDB.

外部の MongoDB インスタンスを CircleCI Server に接続する

外部の MongoDB インスタンスを設定したら、values.yaml ファイルに以下を追加して、CircleCI Server インスタンスに接続します。

mongodb:
  internal: false
  hosts: <hostname:port> # this can be a comma-separated list of multiple hosts for sharded instances
  ssl: <ssl-enabled>
  # If using an SSL connection with custom CA or self-signed certs, set this
  # to true
  tlsInsecure: false
  # Any other options you'd like to append to the MongoDB connection string.
  # Format as query string (key=value pairs, separated by &, special characters
  # need to be URL encoded)
  options: <additional-options>
  auth:
    database: <authentication-source-database
    mechanism: SCRAM-SHA-1

この変更は、helm install/upgrade を実行したときに有効になります。 外部化した MongoDB インスタンスへの移行を完了している場合、helm upgrade を実行すると、スケールダウンされたポッドが values.yaml で定義されたレプリカ番号にスケールバックされます。


Suggest an edit to this page

Make a contribution
Learn how to contribute