文志新的博客

文志新的博客

远程访问非标准 MySQL

当使用非标准安装 MySQL 的情况下,如何开启远程访问呢?对这个问题进行了研究。

  1. 登录到远程服务器,登录 MySQL:
1
mysql -uroot -ppassword

报了下面的错误:

1
Can’t connect to local MySQL server through socket /tmp/mysql.sock

原因是 sock 文件不是默认的位置,而是 /tmp/mysql-generic-5.5.40.sock,做个软链接解决:

1
ln -s /tmp/mysql-generic-5.5.40.sock /tmp/mysql.sock
  1. 可以正常登录了,退出到本地,登录发现还是不能访问,还需要修改 MySQL 参数,重启即可:
1
skip_networking: on #开启即启动端口监听,如需要使用IP地址访问请开启

标准 MySQL 设置详见文章:MySQL、Postgres 开启远程访问权限

如何简单的在 Php 下运行 Git Hook,实现自动部署

由于 php 是运行在 nginx 账户下的,直接使用 shell_exec 会出现权限问题,所以我们首先需要解决权限问题。

  1. 登录到 www-data 用户
1
2
usermod -s /bin/bash www-data
su www-data
  1. 创建 id_rsa 并将内容复制到目标 git 中
1
2
3
ssh-keygen -t rsa -C "wenzhixin2010@gmail.com"

cat ~/.ssh/id_rsa.pub
  1. 测试并 clone 所需要的仓库
1
2
ssh -T git@github.com
git clone git@github.com:wenzhixin/php-blog
  1. 添加 api.php 文件
1
2
3
4
<?php
if ($_GET['key'] == 'xxx') {
    shell_exec('git pull > logs/git.log');
}
  1. 在 git 仓库中设置 WebHooks 即可
1
URL: api.php?key=xxx

安装 GitLab 到 Ubuntu14.04,配置和迁移

现在 gitlab 最新的版本是可以直接通过 apt-get 进行安装升级的。以前公司安装的版本都是通过命令行的方式进行安装,很麻烦也容易出错。现在尝试从 Ubuntu12.04 非集成版迁移到 Ubuntu14.04 apt 版本。花了不少时间,这里记录下最简单的步骤。

我们迁移的关键点为:

  • 系统迁移,从 Ubuntu12.04 到 Ubuntu14.04
  • 数据库迁移,从 MySQL 到 PostgreSQL
  • 软件版本迁移,从非集成版到集成版(deb包)

安装 gitlab

在新的服务器上通过 apt-get 安装与原服务器相同版本的安装包(7.13.5,不然会导致导入数据出错)。

  1. 安装需要的依赖包
1
2
3
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install curl openssh-server ca-certificates postfix
  1. 信任 GitLab 的 GPG 公钥
1
curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null
  1. 添加源并安装
1
2
3
4
5
6
7
sudo vi /etc/apt/sources.list.d/gitlab-ce.list

deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu trusty main

# sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install gitlab-ce=7.13.5-ce.0

注:由于官网存在墙的问题,我们使用了清华大学的源进行安装。

  1. 配置并启动
1
sudo gitlab-ctl reconfigure

注:这个版本由于 bug 导致一直配置不成功,需要删除 mattermost 的内容才行。

  1. 访问并使用

首次打开需要初始化管理员(root)的密码,初始化完成之后跳转到登录接口,可登录使用。 到这里我们已经在新的服务器上安装了全新的 gitlab-ce。

导出数据

在原来的机器上,我们需要将版本库数据以及数据库数据导出为文件,以便在新系统中使用。

  1. 导出版本库数据
1
2
3
4
5
6
7
8
9
10
11
12
# 切换为 root 用户,不然会有权限问题
sudo -i

# 停止 gitlab

service gitlab stop

# 进入 gitlab 工程目录
cd /home/git/gitlab/

# 备份版本库数据
bundle exec rake gitlab:backup:create RAILS_ENV=production

看到如下信息:

1
Creating backup archive: 1461142074_gitlab_backup.tar ... done

就表示备份完成了,该文件存在于 /home/git/gitlab/tmp/backups 文件夹下。

  1. 导出数据库文件

退出 root 用户,通过命令行对 MySQL 进行备份

1
mysqldump --compatible=postgresql --default-character-set=utf8 -r current_install.mysql -u root gitlabhq_production -p

导出完成后,将 1461142074_gitlab_backup.tar 和 current_install.mysql 拷贝(scp)到新的服务器上备用。

迁移

由于之前用的是 MySQL,因为 MySQL 有一些问题,官方建议使用 PostgreSQL 来代替 MySQL。迁移的原理是先将 MySQL 导出为 sql 文件,然后使用工具将其转换为 PostgreSQL 的文件并导入到 PostgreSQL 中。

  1. 安装所需的库
1
2
3
4
5
6
7
8
sudo apt-get install ed software-properties-common

sudo apt-add-repository ppa:brightbox/ruby-ng
sudo apt-get update
sudo apt-get install ruby2.2

# gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/
sudo gem install bundle
  1. 开始迁移

解压我们的压缩包,我们将其解压到一个空的目录 tar_me_from_inside 下,并删除原来的 tar 文件

1
2
3
mkdir ~/tar_me_from_inside && cd ~/tar_me_from_inside  
tar -xvf ~/1461142074_gitlab_backup.tar  
rm ~/1461142074_gitlab_backup.tar

官网上提供了工具可以将 MySQL 转换为 PostgreSQL

1
2
3
4
5
6
cd ~/  
git clone -b gitlab https://github.com/gitlabhq/mysql-postgresql-converter.git

cd ~/mysql-postgresql-converter  
python db_converter.py ~/current_install.mysql ~/database.psql
ed -s ~/database.psql < move_drop_indexes.ed

替换原来的 db 文件

1
2
3
4
5
cd ~/tar_me_from_inside/db

rm database.sql.gz
mv ~/database.psql database.sql
gzip database.sql

现在,我们将其压缩为原来的文件名

1
2
3
cd ~/tar_me_from_inside 
tar -zcvf ~/1461142074_gitlab_backup.tar . 
cd ~/

接着,我们将生成的 tar 文件拷贝到 /var/opt/gitlab/backups

1
sudo mv 1461142074_gitlab_backup.tar /var/opt/gitlab/backups

停用 unicornsidekiq 并进行恢复

1
2
3
4
5
6
sudo gitlab-ctl stop unicorn  
sudo gitlab-ctl stop sidekiq  
sudo gitlab-rake gitlab:backup:restore BACKUP=1461142074

sudo gitlab-ctl start unicorn  
sudo gitlab-ctl start sidekiq  

最后,配置/etc/gitlab/gitlab.rb文件,将 url 改成服务器所在的 IP 或域名,并将 gitlab 升级到最新版本

1
2
sudo apt-get update
sudo apt-get upgrade

大功告成!


从 7.13.5 升级到 8.6.6 会有一系列的问题。这里记录下:

apt-get update 遇到的问题

1
2
3
4
5
Recipe: gitlab::database_migrations
  * bash[migrate gitlab-rails database] action runrake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DuplicateTable: ERROR:  relation "project_group_links" already exists

解决:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo gitlab-rails dbconsole
psql (9.2.15, server 9.3.10)
WARNING: psql version 9.2, server version 9.3.
         Some psql features might not work.
Type "help" for help.

gitlabhq_production=# INSERT INTO schema_migrations (version) values ('20130711063759');
INSERT 0 1
gitlabhq_production-# INSERT INTO schema_migrations (version) values ('20130820102832');
INSERT 0 1
gitlabhq_production=# 

exit
sudo gitlab-ctl reconfigure
sudo gitlab-rake db:migrate RAILS_ENV=production

migrate 的过程出现的问题(类似的问题需要删除数据库):

1
PG::DuplicateTable: ERROR:  relation "sent_notifications" already exists

解决

1
2
3
4
5
6
7
8
sudo gitlab-rails db
drop table sent_notifications;
drop table lfs_objects;
drop table lfs_objects_projects;
drop table releases;
drop table spam_logs;
drop table todos;
sudo gitlab-rake db:migrate RAILS_ENV=production

配置邮件网关发送邮件的问题

解决

  • configuration gitlab.yml
1
2
3
vi /var/opt/gitlab/gitlab-rails/etc/gitlab.yml

email_from: git@xxxx.com
  • configuration production.rb
1
2
3
4
5
6
vi /opt/gitlab/embedded/service/gitlab-rails/config/environments/production.rb

#config.action_mailer.delivery_method = :sendmail
config.action_mailer.delivery_method = :smtp 
config.action_mailer.perform_deliveries = true 
config.action_mailer.raise_delivery_errors = true
  • configure smtp
1
2
3
4
5
6
7
8
9
10
11
12
13
vi /opt/gitlab/embedded/service/gitlab-rails/config/initializers/smtp_settings.rb 

if Rails.env.production? Gitlab::Application.config.action_mailer.delivery_method = :smtp
ActionMailer::Base.smtp_settings = 
  { 
    address: "mail.xxx.com", 
    port: 25, 
    user_name: "git@xxx.com", 
    password: "password", 
    domain: "xxx.com", 
    authentication: :login, 
    enable_starttls_auto: true 
  }
  • test gitlab email notification via change the user email address, from the below log, it seems the email has been sent by gitlab.
1
tail -f /var/log/gitlab/gitlab-rails/production.log Sent mail to git@xxx.com (3053.2ms)

开发 Vue-bootstrap-table 组件之单文件组件

根据文档单文件组件一节,我们可以将组件集成为一个文件,将 html,css,JavaScript 代码都放到同个文件中,最终编译成我们想要的文件。vue 文件的基本模板为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<template>
    <div>
        <h1></h1>
    </div>
</template>
<script>
module.export = {
    props: {
        message: {
            type: String,
            default: 'Hello Vue.js'
        }
    }
};
</script>
<style>
h1 {font-size: 24px;}
</style>

其中 template 为 html 代码,script 为 JavaScript 代码,style 为 css 代码。

这里使用最简单的例子理解如何创建 vue 单文件组件,我们将该文件保存为 Hello.vue,并创建 main.js 文件:

1
2
Hello = require('./Hello.vue');
module.exports = Hello;

然后使用官方工具vue-cli,对我们的组件进行编译,提供了几个模板:

  • webpack - A full-featured Webpack + vue-loader setup with hot reload, linting, testing & css extraction.

  • webpack-simple - A simple Webpack + vue-loader setup for quick prototyping.

  • browserify - A full-featured Browserify + vueify setup with hot-reload, linting & unit testing.

  • browserify-simple - A simple Browserify + vueify setup for quick prototyping.

  • simple - The simplest possible Vue setup in a single HTML file

在这里我使用的是 browserify-simple 的方式。根据文档进行安装即可:

1
vue init bro"wserify-simple hello

然后将上面创建两个文件放到 hello/src 下,然后修改 package.json 中的

1
"build": "cross-env NODE_ENV=production browserify src/main.js > dist/vue-hello.js"

运行 npm run build,就可以在 dist 下得到我们想要的文件了。