docker-gitlab 的数据迁移

这篇文章介绍下如何将容器化的 gitlab 进行数据迁移。

gitlab是什么

GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。

gitlab迁移背景

目前个人环境上跑了一个单机版的 gitlab, 运行命令为:

sudo docker run -d \
   --env GITLAB_OMNIBUS_CONFIG="external_url 'http://xx:8181'" \ 
   --publish 8181:8181 \ 
   --name gitlab \ 
   --restart always \ 
   --volume /app/gitlab/config:/etc/gitlab \ 
   --volume /app/gitlab/logs:/var/log/gitlab \ 
   --volume /app/gitlab/data:/var/opt/gitlab \ 
gitlab/gitlab-ce:9.5.1-ce.0

目前我们需要做的就是将环境配置和数据内容还原到新的环境中去。

迁移过程

  1. 备份数据库和配置文件,将数据文件与配置文件传输到新机器上。

    docker exec -t <your container name> gitlab-rake gitlab:backup:create
    

    备份文件位于宿主机的 /app/gitlab/data/backups 目录下。

    配置文件位于 /app/gitlab/config 文件夹内。

  2. 新机器上运行相同的 run 命令

    # 运行容器
    docker run xxx
    
    # 停止容器
    docker stop gitlab 
    
    # 数据文件和配置文件替换
    mv 1493107454_2017_04_25_9.1.0_gitlab_backup.tar  /app/gitlab/data/backups 
    mv config /app/gitlab/config
    
  3. 重新运行容器,进入容器后断开 gitlab 与 数据库的连接

    # 进入容器
    docker exec -it <your container name> /bin/bash
    gitlab-ctl stop unicorn
    gitlab-ctl stop sidekiq
    
    # 验证
    gitlab-ctl status
    

    还原备份:

    # 重建数据库
    sudo gitlab-rake gitlab:backup:restore BACKUP=1493107454_2017_04_25_9.1.0
    

    重启 gitlab 并验证:

    sudo gitlab-ctl restart
    sudo gitlab-rake gitlab:check SANITIZE=true
    
  4. 大功告成。

参考资料


基于 dnspod 的 ddns 脚本 —— KeluDdnsKit

DDNS是什么

DDNS(Dynamic Domain Name Server)是动态域名服务的缩写。

DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析。

  DDNS

动态域名服务的对象是指IP是动态的,是变动的。普通的DNS都是基于静态IP的,有可能是一对多或多对多,IP都是固定的一个或多个。但DDNS的IP是变动的、随机的。

DDNS 有很多用处,其中最常见的用法类似于 keepalived 的效果:用来防止单点故障。

KeluDdnsKit

今天在 dnspod 的 api 的基础上添加节点存活的检测并自动修改的功能。可以在 github 上查看源码:KeluDdnsKit

具体实现与上边的图片描述是不同的。并没有 DDNS Client这个节点,由 DDNS server 检测节点存活再动态修改 dns server 记录。

用法

  1. 复制dns.conf.example到同一目录下的dns.conf,填充 api 的访问密钥。
  2. 复制domain.list.example到同一目录下的domain.list,填写需要 ddns 的域名。

执行时直接运行ddnspod.sh,默认无限 check domain.list 中的域名,并自动选择可用节点。

配置文件格式:

# 按`TokenID,Token`格式填写
arToken="12345,7676f344eaeaea9074c123451234512d"

# 每行一个域名
test.org www

效果图

keluddnskit

todo

  • 将这个项目容器化,使用更加方便
  • 增加默认配置恢复功能。

docker 时间同步

使用 Docker 有一段时间了,经常会遇到 Docker 容器的时间和宿主机时间不同步的问题。造成这个问题的主要原因是 Docker 并没有进行时间设置,默认为格林尼治时间,与我们所在的东八区相隔了 8 个小时。

目前解决这个问题有以下两种思路:

  • docker run 时指定启动参数,自动挂载localtime文件到容器内
 docker run --name <name> -v /etc/localtime:/etc/localtime:ro  .... 
  • 在 Dockerfile 中设置
ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone

参考资料


Linux命令之 dig

dig的全称是 (domain information groper)。它是一个用来灵活探测DNS的工具。它会打印出DNS name server的回应。它灵活性好、易用、输出清晰,经常被 DNS 管理员作为 DNS 问题的故障诊断工具。

可以直接使用网页接口体验: https://www.diggui.com/

安装

debian系:

apt-get install dnsutils

centos系:

yum install bind-utils

用法

@<服务器地址>:指定进行域名解析的域名服务器;
-b<ip地址>:当主机具有多个IP地址,指定使用本机的哪个IP地址向域名服务器发送域名查询请求;
-f<文件名称>:指定dig以批处理的方式运行,指定的文件中保存着需要批处理查询的DNS任务信息;
-P:指定域名服务器所使用端口号;
-t<类型>:指定要查询的DNS数据类型;默认情况下是A,也可以设置MX等类型;
-x<IP地址>:执行逆向域名查询;
-4:使用IPv4;
-6:使用IPv6;
-h:显示指令帮助信息。

dig最下面显示了查询所用的时间及DNS服务器,时间,数据大小。对于排查DNS问题很有用。

YUKI.N > dig sina.com
; <<>> DiG 9.9.5-9+deb8u15-Debian <<>> sina.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27993

;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;sina.com.                      IN      A
;; ANSWER SECTION:
sina.com.               46      IN      A       66.102.251.33

;; Query time: 3 msec
;; SERVER: 100.100.2.138#53(100.100.2.138)
;; WHEN: Tue Mar 27 21:17:51 CST 2018
;; MSG SIZE  rcvd: 42

精简输出

  1. 使用+nocmd的话,可以节省输出dig版本信息。

  2. 使用+short的话,仅会输出最精简的CNAME信息和A记录,其他都不会输出。

  3. 使用+nocomment的话,可以节省输出dig的详情注释信息。

  4. 使用+nostat的话,最后的统计信息也不会输出。

常用用法

  • 只输出A记录(写脚本的时候容易获取ip地址)

    dig jpuyy.com +short
    
  • 只输出mx记录

    dig mx jpuyy.com +short
    
  • 只输出NS记录

    dig ns jpuyy.com
    
  • 查询SOA( Start of Autority ) 返回主DNS服务器

    dig soa jpuyy.com
    
  • 指定dns查询

    dig +short @8.8.8.8 jpuyy.com
    
  • 跟踪dig全过程

    +trace,当使用这个查询选项后,dig会从根域查询一直跟踪直到查询到最终结果,并将整个过程信息输出出来。

    dig +trace cdn.kelu.org
    
  • 逆向查询 -x。可以查询IP地址到域名的映射关系。

    dig -x 193.0.14.129
    
  • TCP代替UDP

    dig +tcp www.baidu.com
    

参考资料


适用于各种项目的 gitignore

这篇文章会不断更新。

简约版

# Eclipse
.classpath
.project
.settings/
 
# Intellij
.idea/
*.iml
*.iws
 
# Mac
.DS_Store
 
# Maven
log/
target/

# Vim
*~
*.swp

完全版

以下是由 github 官方维护的,专门针对 JetBrains 全线产品的 gitignore:

# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/dictionaries

# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml

# Gradle
.idea/**/gradle.xml
.idea/**/libraries

# CMake
cmake-build-debug/
cmake-build-release/

# Mongo Explorer plugin
.idea/**/mongoSettings.xml

# File-based project format
*.iws

# IntelliJ
out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Cursive Clojure plugin
.idea/replstate.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

# Editor-based Rest Client
.idea/httpRequests

参考资料


一款好用的 markdown 编辑器 —— Typora | 少数派

以前曾介绍过一款 markdown 编辑器 —— Yu Writer,确实好用。不过开发者已经很久没更新了,期望的一些特性也没有添加上去。最近又发现了一款不错的编辑器,而且是全平台支持的。与其它一些 markdown 编辑器最大的不一样是——所见即所得,不再是一边源文件一遍预览的方式了。

目前我还是用 Yu Writer 作为公众号的排版使用,Typora作为日常编辑使用。

总的说来 Typora 很赞,推荐一波。

点此前往官网下载 Typora

以下转载自少数派:《让 Markdown 写作更简单,免费极简编辑器:Typora》

Markdown 其实向来是文字爱好者和码农们的小众需求,但市面上竟涌现出了这么多种形形色色的 Markdown 编辑器,MouTypedUlysessMacdown 等等,各有特色,难分伯仲。特别是国内口碑颇高的 Mou,说好的 1.0 版本也总是姗姗来迟,又跳票到了今年八月。


如果你还不了解 Markdown 及相关背景知识,可以参见:


然而看看市面上现在比较流行的 Markdown 编辑器,都基本采用了「写字」和「预览」相分离的策略,无论是像 Mou 这样将窗口左右排列,还是像 Typed 一样两种状态需要切换显示,都似乎离 Markdown 的初衷渐行渐远:优雅可控的格式是为了让文字本身更易读。然而,在实际使用的时候,由于文字的输入源和文字的输出源是割裂的,这件事情本身就显得不纯粹,再加上众多 Markdown 编辑器始终没有着手解决表格、代码等格式的编辑,也使 Markdown 变得不那么优雅。是的,如果你用 Markdown 原生格式去编辑过一个表格,你应该懂我的意思。


git pull 时报错 The remote end hung up unexpectedly

在进行git clone 下载项目是,出现了这样的错误:

error: RPC failed; curl 56 Recv failure: Connection was reset fatal: The remote end hung up unexpectedly

快速方案:

git config --global http.postBuffer 524288000

或者将http.postBuffer调整的更大:

git config --global http.postBuffer 1048576000

更多信息:

git config手册, 可以了解到http.postBuffer :

Maximum size in bytes of the buffer used by smart HTTP transports when POSTing data to the remote system. For requests larger than this buffer size, HTTP/1.1 and Transfer-Encoding: chunked is used to avoid creating a massive pack file locally. Default is 1 MiB, which is sufficient for most requests.

翻译过来就是HTTP传输的缓冲区大小,避免在本地创建大量的包文件。

Error code 56 表示curl接收错误。

参考资料