애플리케이션용 데이터베이스 생성 및 이동 경로를 통한 첫 번째 마이그레이션 생성
연결
https://github.com/EndyKaufman/kaufman-bot - 봇의 소스 코드
https://telegram.me/DevelopKaufmanBot - 전보의 현재 봇
https://flywaydb.org - flyway는 오픈 소스 데이터베이스 마이그레이션 도구입니다. 구성보다 단순성과 관습을 강력하게 선호합니다.
https://www.npmjs.com/package/node-flywaydb - flywaydb cli용 NodeJs 래퍼
https://github.com/rucken/rucken - nx monorepositories를 위한 나의 작은 유틸리티
종속성 설치
마이그레이션 작업을 위한 교차 데이터베이스 도구 설치
npm i --save-dev node-flywaydb
endy@endy-virtual-machine:~/Projects/current/kaufman-bot$ npm i --save-dev node-flywaydb
added 14 packages, and audited 918 packages in 3s
115 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
데이터베이스 연결 문자열 구문 분석을 위한 유틸리티 설치
npm i --save connection-string
endy@endy-virtual-machine:~/Projects/current/kaufman-bot$ npm i --save connection-string
up to date, audited 938 packages in 2s
115 packages are looking for funding
run `npm fund` for details
1 high severity vulnerability
To address all issues, run:
npm audit fix
Run `npm audit` for details.
nx monorepositories용 유틸리티의 최신 버전을 업데이트하거나 설치합니다. 최신 버전에는 루트가 아닌 애플리케이션 데이터베이스를 생성하는 명령이 있습니다.
npm i --save-dev rucken@latest
endy@endy-virtual-machine:~/Projects/current/kaufman-bot$ npm i --save-dev rucken@latest
added 19 packages, changed 1 package, and audited 938 packages in 4s
115 packages are looking for funding
run `npm fund` for details
1 high severity vulnerability
To address all issues, run:
npm audit fix
Run `npm audit` for details.
이동경로 연결
패키지.json 업데이트
패키지.json
{
...
"flyway": "flyway -c .flyway.js",
"migrate": "npm run flyway -- migrate",
"migrate:local": "export $(xargs < ./.env.local) && npm run migrate"
...
}
이동 경로에 대한 구성 파일 추가
.flyway.js
const { ConnectionString } = require('connection-string');
const cs = new ConnectionString(
process.env.POSTGRES_URL || process.env.DATABASE_URL
);
const {
user: USERNAME,
password: PASSWORD,
HOST = cs.host,
DATABASE = cs.path && cs.path[0],
SCHEMA = cs.params && cs.params.schema,
SCHEMAS = cs.params && cs.params.schemas,
} = cs;
module.exports = {
flywayArgs: {
url: `jdbc:postgresql://${HOST}/${DATABASE}`,
schemas: SCHEMAS || SCHEMA,
defaultSchema: SCHEMA,
locations: `filesystem:migrations`,
user: USERNAME,
password: PASSWORD,
table: '__migrations',
sqlMigrationSuffixes: '.pgsql',
},
// Use to configure environment variables used by flyway
env: {
JAVA_ARGS: '-Djava.util.logging.config.file=./conf/logging.properties',
},
version: '6.3.2', // optional, empty or missing will download the latest
mavinPlugins: [
{
// optional, use to add any plugins (ie. logging)
groupId: 'org.slf4j',
artifactId: 'slf4j-api',
version: '1.7.25',
// This can be a specifc url to download that may be different then the auto generated url.
downloadUrl:
'https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar',
},
{
groupId: 'org.slf4j',
artifactId: 'slf4j-jdk14',
version: '1.7.25',
},
],
downloads: {
storageDirectory: `${__dirname}/tmp`, // optional, the specific directory to store the flyway downloaded files. The directory must be writable by the node app process' user.
expirationTimeInMs: -1, // optional, -1 will never check for updates, defaults to 1 day.
},
};
환경 파일 업데이트
.env.local
TELEGRAM_BOT_TOKEN=1111111:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ROOT_POSTGRES_USER=postgres
ROOT_POSTGRES_PASSWORD=postgres
ROOT_POSTGRES_URL=postgres://${ROOT_POSTGRES_USER}:${ROOT_POSTGRES_PASSWORD}@localhost:5432/postgres?schema=public
SERVER_POSTGRES_URL=postgres://admin_develop:password_develop@localhost:5432/kaufman_bot_develop?schema=public
마이그레이션 추가
텔레그램 사용자의 언어를 저장하기 위한 마이그레이션을 만들어 봅시다
마이그레이션/V202203252131CreateUserTable.pgsql
CREATE TABLE IF NOT EXISTS "User" (
id uuid DEFAULT uuid_generate_v4 () NOT NULL,
"telegramId" varchar(64) NOT NULL,
"langCode" varchar(64) DEFAULT 'en' NOT NULL,
CONSTRAINT "PK_USERS" PRIMARY KEY (id)
);
CREATE UNIQUE INDEX IF NOT EXISTS "UQ_USERS__TELEGRAM_ID" ON "User" ("telegramId");
테스트 데이터 추가
마이그레이션/V202203252144ExampleDataForUserTable.pgsql
INSERT INTO "User" ("telegramId")
VALUES ('testId')
ON CONFLICT ("telegramId")
DO NOTHING;
개발 인프라 업데이트
docker compose 구성 업데이트
도커/dev/docker-compose.yml
...
services:
kaufman-bot-postgres:
image: "endykaufman/postgres-default"
container_name: "kaufman-bot-postgres"
environment:
- POSTGRES_USER=${ROOT_POSTGRES_USER}
- POSTGRES_PASSWORD=${ROOT_POSTGRES_PASSWORD}
- POSTGRES_DB=postgres
env_file:
- ../../.env.local
ports:
- "5432:5432"
volumes:
- kaufman-bot-postgres-volume:/var/lib/postgresql/data
networks:
- kaufman-bot-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
...
업데이트 스크립트
도커/dev/docker-compose-up.sh
#!/bin/bash
#export UID=$(id -u)
#export GID=$(id -g)
export CURRENT_UID=$(id -u):$(id -g)
docker volume create --name=kaufman-bot-postgres-volume --label=kaufman-bot-postgres-volume
# Start only database
docker-compose -f ./docker/dev/docker-compose.yml --compatibility up -d kaufman-bot-postgres
# Wait ready datatbase
until docker exec -it $(docker ps -aqf "name=kaufman-bot-postgres") pg_isready -U postgres; do
echo "Waiting for postgres..."
sleep 2
done
# Create all need application databases by exists match evn key and nx app name
# for app: "server" - env: SERVER_POSTGRES_URL
# for app: "core-server" - env: CORE_SERVER_POSTGRES_URL
npm run rucken -- postgres
# Run migrate database for specific database
export DATABASE_URL=$SERVER_POSTGRES_URL && npm run migrate
# Start all services
docker-compose -f ./docker/dev/docker-compose.yml --compatibility up -d
prod infra의 경우 다른 폴더에서만 같은 작업을 수행합니다.
개발 인프라 재시작
npm run docker:dev:clean-restart
endy@endy-virtual-machine:~/Projects/current/kaufman-bot$ npm run docker:dev:clean-restart
> [email protected] docker:dev:clean-restart
> npm run docker:dev:clean-down && npm run docker:dev:up
> [email protected] docker:dev:clean-down
> export $(xargs < ./.env.local) > /dev/null 2>&1 && ./docker/dev/docker-compose-clean-down.sh
Stopping kaufman-bot-server ... done
Stopping kaufman-bot-postgres ... done
Removing kaufman-bot-server ... done
Removing kaufman-bot-postgres ... done
Removing network dev_kaufman-bot-network
kaufman-bot-postgres-volume
> [email protected] docker:dev:up
> export $(xargs < ./.env.local) > /dev/null 2>&1 && ./docker/dev/docker-compose-up.sh
kaufman-bot-postgres-volume
Creating network "dev_kaufman-bot-network" with the default driver
Creating kaufman-bot-postgres ... done
/var/run/postgresql:5432 - no response
Waiting for postgres...
/var/run/postgresql:5432 - accepting connections
> [email protected] rucken
> rucken "postgres"
> [email protected] migrate
> npm run flyway -- migrate
> [email protected] flyway
> flyway -c .flyway.js "migrate"
Flyway Community Edition 6.3.2 by Redgate
Database: jdbc:postgresql://localhost:5432/kaufman_bot_develop (PostgreSQL 13.3)
WARNING: Flyway upgrade recommended: PostgreSQL 13.3 is newer than this version of Flyway and support has not been tested. The latest supported version of PostgreSQL is 12.
Successfully validated 2 migrations (execution time 00:00.013s)
Creating Schema History table "public"."__migrations" ...
Current version of schema "public": << Empty Schema >>
Migrating schema "public" to version 202203252131 - CreateUserTable
Migrating schema "public" to version 202203252144 - ExampleDataForUserTable
Successfully applied 2 migrations to schema "public" (execution time 00:00.043s)
kaufman-bot-postgres is up-to-date
Creating kaufman-bot-server ... done
데이터베이스 확인
데이터베이스로 컨테이너에 연결
docker exec -it $(docker ps -aqf "name=kaufman-bot-postgres") sh
애플리케이션 데이터베이스에 psql로 연결
set PGPASSWORD=password_develop&& psql -d kaufman_bot_develop -U admin_develop
텔레그램 사용자 선택
select * from "User";
endy@endy-virtual-machine:~/Projects/current/kaufman-bot$ docker exec -it $(docker ps -aqf "name=kaufman-bot-postgres") sh
# set PGPASSWORD=password_develop&& psql -d kaufman_bot_develop -U admin_develop
psql (13.3 (Debian 13.3-1.pgdg100+1))
Type "help" for help.
kaufman_bot_develop=> select * from "User";
id | telegramId | langCode
--------------------------------------+------------+----------
c98e49b5-2fa5-4748-896d-1dbca9cc7112 | testId | en
(1 row)
다음 포스팅에서는 dokku infra에 데이터베이스를 생성하고 github에서 마이그레이션 설정을 해보겠습니다.
Reference
이 문제에 관하여(애플리케이션용 데이터베이스 생성 및 이동 경로를 통한 첫 번째 마이그레이션 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/endykaufman/create-a-database-for-the-application-and-create-first-migration-via-flyway-4hjb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)