golang migrate 사용시 에러

필요성

예전 golang 코드에 사용하고 있는 db migration 관리 라이브러리: migrate이 라이브러리는 기존 레포에서,
GitHub – mattes/migrate: Database migrations. CLI and Golang library. ->
아래 레포로 리포지토리가 변경되어 관리 중에 있었습니다.
GitHub – golang-migrate/migrate: Database migrations. CLI and Golang library.

기존 코드 수정이 필요해서 README 를 읽기 위해 들어왔다가 기존 코드가 예전과는 다르게 변경, 관리되는 것을 알게되어서 레포 변경을 하기로 마음을 먹었습니다.

문제

migrate up


변경 후 migrate up 실행시에 아래와 같은 문제가 발생했습니다.

error: pq: column “dirty” does not exist in line 0 · Issue #34 · golang-migrate/migrate · GitHub

아마 dirty 컬럼이 추가 된 듯 합니다.
dirty column 을 수동으로 추가해줍니다.

alter table schema_migrations add column dirty boolean not null default false;

다시 migrate 를 실행하면 정상동작합니다.

Postgres driver 를 사용할때 발생하는 문제


  • Postgres driver 를 사용할때 발생하는 문제
  • Migrate 라이브러리 import 후에 New, Up 코드 작성
  • Compile and Run
  • have panic….
panic: sql: Register called twice for driver postgres

goroutine 1 [running]:
database/sql.Register(0x1f34e5d, 0x8, 0x2794580, 0x281b590)
        /Users/ktg/.gvm/gos/go1.9/src/database/sql/sql.go:50 +0x1ad
github.com/golang-migrate/migrate/vendor/github.com/lib/pq.init.0()
        /Users/ktg/go/src/github.com/golang-migrate/migrate/vendor/github.com/lib/pq/conn.go:49 +0x5c
github.com/golang-migrate/migrate/vendor/github.com/lib/pq.init()
        <autogenerated>:1 +0x782
github.com/golang-migrate/migrate/database/postgres.init()
        <autogenerated>:1 +0x7d
devops-mocha3/cmd/mocha/setup.init()
        <autogenerated>:1 +0x5d
main.init()
        <autogenerated>:1 +0x78

처음엔 뭘 잘못 했나 싶어서 이것 저것 해봤는데, 동일 증상…

그러다 이런 글 발견
Driver is being registered twice · Issue #238 · lib/pq · GitHub

이번 문제는 vendor에 있는 파일(lib/pg)을 한번 호출 하고, 다시 GOPATH 에 있는 파일을 호출한 것.

수정을 위해 dep ensure 실행을 해줍니다.
그리고 다시 컴파일 후 실행하면 정상동작합니다.

Postgresql 명령어 정리

Postgresql 의 명령어를 간단히 정리해보겠습니다.

항상 잊어버리는 명령어를 기록해두기위한 차원입니다.

console 접속

$ psql database_name

접속 종료

-# \q

database list

-# \l

database create

CREATE DATABASE sentry WITH ENCODING='UTF8' OWNER=postgres;

database select

-# \c database_name

사용자 목록 표시

-# \du

Role 생성

-# CREATE ROLE <role name> WITH LOGIN;

Role 추가

ref: PostgreSQL: Documentation: 8.1: ALTER ROLE

-# ALTER ROLE <role name> WITH LOGIN CREATEDB;

Column 추가

phone 컬럼 추가: not null, default 값은 false

database_name-# ALTER TABLE users ADD COLUMN phone boolean not null default false;

Column 삭제

database_name-# ALTER TABLE users DROP COLUMN phone;

Constraint 추가

ALTER TABLE app_config
    ADD CONSTRAINT ukey_app_config_app_id UNIQUE (app_id);

Constraint 삭제

ALTER TABLE app_config
    DROP CONSTRAINT ukey_app_config_app_id;

table list

database_name-# \d

현 database의 모든 index list

database_name-# \di 

특정 테이블 정보 보기

users 테이블 정보 보기

database_name-# \d users

database dump

pg_dump 데이터베이스명 > 파일명.dump

$ pg_dump -Fc dbname > outfile

database restore

$ pg_restore --clean database_name my.dump

상세

  • —clean: database를 깨끗히 날리고 새로 생성
  • —no-owner: 소유자 정보는 복원할때 포함하지 않음
  • -h: host name
  • -U: user name
  • -d: database name
$ pg_restore --verbose --clean --no-owner -h localhost -U postgres -d database_name my.dump

sql file execute

  1. Shell
$ psql -U username -d myDataBase -a -f myInsertFile
  1. cli
\i path_to_sql_file

CentOS7에 Discourse 설치 및 서비스 시작하기

1. redis install

$> sudo yum install -y epel-release
$> sudo rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
$> sudo yum --enablerepo=remi update remi-release
$> sudo systemctl start redis.service
$> sudo systemctl enable redis.service
$> sudo systemctl status redis.service

status 실행 후

● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/redis.service.d
           └─limit.conf
   Active: active (running) since Thu 2016-06-30 16:31:27 KST; 1 weeks 3 days ago

위처럼 active 상태가 나타나면 정상 동작 중이다.

2. postgresql 설치

$> sudo yum install -y postgresql-server postgresql-contrib postgresql-libs postgresql-devel
$> sudo postgresql-setup initdb
$> sudo systemctl start postgresql
$> sudo systemctl enable postgresql
$> sudo systemctl status postgresql

postresql 도 위의 redis와 마찬가지로 active 상태가 나오면 정상동작 중이다.

3. rvm install for multi users

루비 설치가 필요하다. 상세 내용은 예전 포스팅을 참조한다.

http://weeppp.com/?p=93

$> sudo gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
$> sudo curl -sSL https://get.rvm.io | sudo bash -s stable

rvm 그룹에 자신의 user id를 추가한다.

$> sudo vi /etc/group
...

rvm:x:505:user,user2,user3

 

logout 후 재접속 한다. 환경 설정 리로드를 위함

# restart
$> type rvm | head -n 1
rvm is a function

위의 내용이 출력되면 정상 설치

$> rvm install 2.3.1
$> rvm use 2.3.1@newgemset --create --default
$> gem update
$> gem install bundler

4. Node install

$> curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash
# exit the terminal and open it again

logout 후에 다시 재접속한다.

$> nvm install 6.2.0
$> nvm alias default 6.2.0
$> npm install -g svgo phantomjs-prebuilt

 

5. discourse install

하단 링크 참조

https://github.com/discourse/discourse/blob/master/docs/DEVELOPER-ADVANCED.md

필요한 라이브러리들 설치

$> sudo yum install -y expect git-core ImageMagick* advancecomp gifsicle jhead jpegoptim optipng pngcrush pngquant

 

db 설정

여기서는 development, production database를 모두 만든다.

하단 ‘password’ 부분에 원하는 암호를 입력한다.

$> whoami > /tmp/username
$> sudo su postgres
$> createuser --createdb --superuser -Upostgres $(cat /tmp/username)
$> psql -c "ALTER USER $(cat /tmp/username) WITH PASSWORD 'password';"
$> psql -c "create database discourse_development owner $(cat /tmp/username) encoding 'UTF8' TEMPLATE template0;"
$> psql -c "create database discourse_test owner $(cat /tmp/username) encoding 'UTF8' TEMPLATE template0;"
$> psql -c "create database discourse owner $(cat /tmp/username) encoding 'UTF8' TEMPLATE template0;"
$> psql -d discourse_development -c "CREATE EXTENSION hstore;"
$> psql -d discourse_development -c "CREATE EXTENSION pg_trgm;"
$> psql -d discourse -c "CREATE EXTENSION hstore;"
$> psql -d discourse -c "CREATE EXTENSION pg_trgm;"
$> exit

 

discourse 설치

$> git clone https://github.com/discourse/discourse.git ~/discourse
$> cd ~/discourse
$> bundle install
$> bundle exec rake db:create db:migrate db:test:prepare

개발 모드로 실행 확인

$> bundle exec sidekiq -d -L log/sidekiq.log -C config/sidekiq.yml
$> thin start

 

이제 배포판을 설치해보려고 한다.

실제 이 포스팅은 production 모드 설치를 위해 쓰고 있는 것이므로 지금부터가 진짜다;;

 

설정 파일 생성

$> cd $(discourse_home)/config
$> cp discourse_defaults.conf discourse.conf

설정파일 수정

$> vi discourse.conf
# username accessing database
db_username = user_id

# password used to access the db
db_password = password

...

# hostname running the forum
hostname = "weeppp.com"

...

# enable if you really need to serve assets in prd
serve_static_assets = true

sidekiq 설정

$> vi sidekiq.yml
---
:pidfile: tmp/pids/sidekiq.pid
staging:
:concurrency: 10
production:
:concurrency: 20
development:
:concurrency: 10
:queues:
- [critical,4]
- [default, 2]
- [low]

production mode db생성

$> cd ~/discourse
$> RAILS_ENV=production bundle exec rake db:create db:migrate db:test:prepare

nil:class 에러가 나오던데 별 문제는 아니었던 것 같다.

관련 포스트가 meta.discourse.org 에 있었던 것 같으니 찾아보길 바란다.

sidekiq production mode 실행

$> bundle exec sidekiq -d -L log/sidekiq.log -C config/sidekiq.yml -e production

관리자 테스트 계정 생성

$> cd ~/discourse
$> cp db/api_test_seeds.rb db/seeds.rb
$> RAILS_ENV=production bundle exec rake db:seed
$> RAILS_ENV=production rails c
> u = User.last
> u.activate
> u.save
> quit

80포트로 실행하기 위해서는 root 권한이 필요한데 이때 postgresql 인증 문제가 발생한다.

postgresql 인증설정 변경이 필요하다. 하단 링크 참조

http://stackoverflow.com/questions/18664074/getting-error-peer-authentication-failed-for-user-postgres-when-trying-to-ge

postgresql 설정 변경

$> sudo /var/lib/pgsql/data/pg_hba.conf
local   all             postgres                                peer

Should be

local   all             postgres                                md5
$> sudo systemctl restart postgresql

에셋 빌드

$> RAILS_ENV=production bundle exec rake assets:precompile

thin 서버 실행

$> rvmsudo rails server thin -b 0.0.0.0 -p 80 -e production