将 Gitlab 迁移到新服务器

今天把一台服务器上的 Gitlab 换了个地儿, 记录一下遇到的大大小小的各种坑们:

  • 原服务器系统是 Ubuntu, 而新的是 Debian, 各种库版本不一样(从 glibc 开始), 于是 Ruby 的 vender 文件夹显然不能留, 各种清空重新跑 bundle.
  • Gitlab 用到了 Redis, 虽然主要的配置说明里没有用力提及. 因此搬的时候连 Redis 的数据库一起搬过去. (当然主力数据库比如 MySQL 也必须不能忘记啦)
  • /home/git/.ssh/authorized/keys 保存了能用 git 帐号登陆服务器的所有小伙伴的 SSH PubKey 们, 需要一起搬过来
  • gitlab-shell 需要重新安装以走进科学 (只需要跑它那个 bin/install)
  • initscript 脚本和 logrotate 配置都要重新安装不能忘记的说
  • nginx 需要访问 gitlab 的 socket, 而 rsync 过来的目录里因为 exclude 掉了 gitlab/tmp/ 里的内容, 自动新创建的目录默认会变成 700 权限, 导致 nginx 读取失败 – 嗯 chmod 回来

至于其他系统软件包和 ruby 的基本配置就不再赘述了.

最后详细记录下环境:
原服务器: Ubuntu 12.04, 开启了 nginx/git 等等 PPA. 本体是 42qu 的一台 VPS.
新服务器: Debian 7.2, 开启了 dotdeb 仓库. 本体是美团云的一台 VPS.

记一次在 AWS 网络出故障的时候让自己的线上服务提前”恢复”

嗯, 首先声明, 这个方法不具备普适性, 甚至几乎完全是一个运气问题, 不过总觉得这么神奇的事情还是写一下吧, 于是才有了这篇 blog.

22:08 A 服务器突然离线, 访问分配的 Elastic IP 不通.
22:15 发现我在同机房的另一台 AWS (B) 在线, 遂登陆访问 A 的 AWS 私有 IP – 通!
22:20 用 B 开 ssh -D, 配合 tsocks 登陆 A 的 AWS 私有 IP, 检查服务器状况良好. 抓包确认包可以正常从 Elastic IP 出去, 但是回不来. 确认是 AWS 的错.
22:23 登陆 Cloudflare 修改服务的解析到 B. (Automatic 的 DNS 缓存时间居然只有 30 秒, 怒赞)
22:32 AWS 在其 status 页面宣布 “We are investigating network connectivity issues for instances in the US-EAST-1 Region.”
22:35 在 B 上用 nginx 架设反向代理, 并拷贝本地备份的 A 的 SSL 证书到 B. 服务恢复在线.
23:02 A 的原 Elastic IP 恢复正常访问.

嗯, 是时候折腾些自动化工具来做反代了, 有时候出其不意的能发挥点作用. 这次我的 downtime 比 AWS 的 downtime 短了近一倍, 然而如果我架设反代的速度再快点, 还能有更大提升的说(

Continue reading 记一次在 AWS 网络出故障的时候让自己的线上服务提前”恢复”

[译] 如何防止丢失任何 bash 历史命令?

原文链接: http://mywiki.wooledge.org/BashFAQ/088
译者: Felix Yan

注: 这个方法是为了让你保存一个用户的完整命令记录; 它不是用来对用户输入的命令做安全审计的 – 对这个用途, 请阅读提升 bash 安全-防止命令历史被移除 (英文)

默认情况下, bash 只在退出的时候更新命令历史, 而且这个”更新”是用新版直接覆盖旧版. 这会使你无法保持一份完整的命令历史记录, 原因有两个:

  • 如果一个用户登录多次, 这种覆盖的机制会使得只有最后一个退出的 bash 能保存它的历史记录. (一个登录的用户打开多个终端模拟器, 或者使用 screen/tmux 等工具启动多个 bash 等也在此列 – 译者注)
  • 如果你的 bash 异常退出了 – 比如网络故障, 防火墙更改, 或者它的进程被杀掉了 – 会话中所有的历史记录都会丢失.

为了解决前一个问题, 我们设置命令行选项 histappend 来采用”追加”的方式写入新的命令历史记录, 并保证了多次登录不会覆盖彼此的历史记录.

为了使得命令历史记录不因为 bash 异常退出而丢失, 我们需要保证每次命令之行后, 对应命令的历史记录就被写入. 我们可以用 bash 内置的 history -a 命令来强制立刻写入命令历史记录, 而且我们可以将这个命令添加到 PROMPT_COMMAND 环境变量中, 使得这个过程自动化. 这个环境变量会在每次新的命令提示符出现前被执行一次, 因此会在每个命令执行后被执行.

Continue reading [译] 如何防止丢失任何 bash 历史命令?

[非技术] 谈谈开源社区和贡献

(一不小心就起了这么大个标题, 汗…

前几天忙搬家, 今天 @xiehuc 提起我才知道 OpenSUSE 中文社区的事. 本来一如既往的懒得动笔, 不过看到博客又有几个月没更新都快长草了, 还是决定随便写点什么, 凑凑字数也好.

我进入开源社区的时间并不长. 虽然 2008 年开始用 Ubuntu 作为主力系统 (后来又一度中断过, 转而使用 Windows 7 等), 但是直到 2009 年才萌生社区贡献的念头. 当时的契机是 OwnLinux 翻译小组招人的消息在 QQ 群里被我看到了, 恰好当时的群主圈圈 (又名蛋蛋, Q名 Oo…) 是负责人之一, 于是我愉快的寄去了一封报名邮件, 然后很快完成了考核(翻译测试)成为了正式的一员.

2013-06-16-225658_772x161_scrot

我在差不多的时间段里也在 launchpad 上参与了一些软件和distro方面本地化的工作. 现在想起来, 当时还真是选择了最合适, 也是最不合适的一件事情来贡献. 说最合适, 是因为那时候技术啥都不懂, 能做的事情差不多只剩下翻译了; 说最不合适, 是因为我当时努力学英语, 各系统(包括 Windows) 都用的纯英文版, 自己从来都看不到自己翻译的结果.

没有回馈也并不是兴趣所在的工作, 热情一过就只是靠责任感维持住的. 翻了翻邮件, 这件事情即使通过责任感也并未持续很久: 总共在 OwnLinux 上翻译的文章也并不多, 时间上也只有一年不到.

Continue reading [非技术] 谈谈开源社区和贡献

Arch Linux 折腾小记 – 申请 TU 通过后三个多月来我做了什么?

自从我申请 Arch Linux Trusted User 通过后:

我往 [community] 仓库添加了这些软件包(按先后顺序):

  • pyzy: 作为 ibus-pinyin 的新依赖引入, 拼音注音库
  • kcm-fcitx: Fcitx 输入法框架(下文简称 Fcitx)的 KDE Config Module (KDE 控制面板模块)
  • fcitx-cloudpinyin: Fcitx 的云拼音输入引擎插件 (注意这不是一个输入法哦! 在 fcitx 中各拼音输入法的第二个候选词的位置插入一个云拼音引擎的返回结果, 支持 QQ/搜狗/百度/Google 的云输入法 API)
  • fcitx-configtool: Fcitx 的经典配置工具, 基于 gtk3
  • fcitx-sunpinyin: 为 Fcitx 添加 sunpinyin (中文拼音)输入引擎支持 (词典相当智能, 强力推荐)
  • fcitx-anthy: 为 Fcitx 添加 anthy (日语)输入引擎支持
  • fcitx-chewing: 为 Fcitx 添加 chewing (繁体中文注音)输入引擎支持
  • libpinyin: 一个智能拼音输入引擎, 现在词典弱于sunpinyin
  • fcitx-libpinyin: 为 Fcitx 添加 libpinyin (中文拼音)输入引擎支持
  • ibus-libpinyin: 为 IBus 输入法框架添加 libpinyin (中文拼音)输入引擎支持
  • libgooglepinyin: 一个由 Android 上的 Google Pinyin Fork 出来的(中文拼音)输入引擎
  • fcitx-googlepinyin: (略, 你懂的)
  • ibus-googlepinyin: (同上)
  • cgminer: bitcoin (比特币) 的一个挖矿工具, 支持 CPU 和 GPU, 高效稳定, 各种推荐
  • opencc: 开源中文简繁转换库 (fcitx 的可选依赖)
  • fcitx-unikey: 为 Fcitx 添加 unikey (越南语)输入引擎支持
  • fcitx-m17n: 为 Fcitx 添加 m17n (多国语言码表)输入引擎支持
  • google-glog: Google 的一个 C++ 日志库, 作为  librime 的依赖引入
  • kyotocabinet: 一个 C++ 的 DBM 实现, 作为  librime 的依赖引入 (我才不知道这是神马呢)
  • librime: 中州韵, 一个(繁体为主)中文智能输入引擎, 支持拼音, 粤拼, 五笔, 注音等等
  • brise: librime 的词库
  • fcitx-rime: (略, 你懂的)
  • ibus-rime: (同上)
  • yamdi: BOYPT 大大 request 的一个 FLV 文件折腾器
  • ttf-hanazono: 一个免费的日语汉字库, 包括了超过8万(达到 Ext D 区)的汉字, 是覆盖汉字最全的免费字体(注意, 安装后有42M大哟)
  • pidgin-hotkeys: Pidgin 的全局热键支持插件
  • wqy-microhei: 大名鼎鼎的文泉驿微米黑
  • gtest: Google 的一个 C++ 测试框架, 作为 fcitx-rime 的编译依赖引入
  • fcitx-table-extra: Fcitx 的一些额外码表支持(包括仓颉3, 仓颉5, 粤拼, 速成, 五笔, 郑码, 还有一些我不认识的>.<)
  • fcitx-hangul: 为 Fcitx 添加 hangul (韩语)输入引擎支持
  • osdlyrics: 支持多款播放器的歌词显示插件
  • zinnia: 一个手写识别库, 作为 fcitx-rime 的依赖引入
  • fcitx-mozc: 为 Fcitx 添加 mozc (日语)输入引擎支持 (mozc 是 Google 日语输入法的开源版本)
  • pidgin-lwqq: Pidgin 的一个 webqq 协议插件, 已经支持群聊/收发图片/传文件/显示备注等等功能
  • python2-xapian: Xapian 索引库的 Python Bindings
  • python-pyquery/python2-pyquery: 一个像 jquery 一样的 Python 库
  • fbterm: 一个使用 frame buffer 设备或者 VESA 显卡的高速终端模拟器(重点是不用图形界面而且支持中文哦)
  • fcitx-fbterm: fbterm 里的 Fcitx 输入法支持
  • fcitx-ui-light: Fcitx 的轻量 UI
  • fcitx-table-other: Fcitx 的一些更奇怪的码表支持(包括 Latex, Emoji, 还有一大堆我不认识的>.<)
  • pep8-python2/pep8-python3: Python 的 PEP8 代码规范检查器
  • gtkhotkey: 一个 Gtk+ 程序的跨平台热键处理库, 作为 synapse 的依赖引入
  • synapse: 一个很赞的 Launcher (类似 Gnome-Do), 被 shellex 大大推荐了之后我就用上了
  • pastebinit: 一个用来上传点什么到某个 pastebin 的命令行工具
  • xnoise: 一个 Gtk+ 的媒体播放器
  • ydcv: (我自己写的)一个简单的命令行(联网)查单词程序, 调用有道词典的公共 API
  • python-bottle/python2-bottle: 一个(我公司在用的) Python Web 框架
  • sunpinyin/sunpinyin-data: 分包了一下 sunpinyin 的数据
  • recorditnow: yuyichao 大大 request 的一个 KDE 里的屏幕录制软件
  • pidgin-kwallet: Pidgin 的 Kwallet 支持插件
  • boinc/boinc-nox: 重新分包的伯克利开放式(志愿者)计算平台软件
  • goagent: (咳咳) 你懂的
  • python2-gevent-beta: Gevent 1.0 系列的 beta 版本, 作为 goagent 的可选依赖引入
  • fcitx-qt5: Fcitx 的 QT5 IM Module (截止发文时间这货还在 [community-staging] 里, 过几天(十几天?)才能出炉哦)

除了这些包外, 我还(参与)维护了这些已经在 [community] (或曾经在 [extra]) 里的包:

  • python2-greenlet
  • ibus-table
  • ibus-sunpinyin
  • ibus-pinyin
  • fcitx
  • ibus-chewing
  • mongodb
  • ibus-m17n
  • python-tornado/python2-tornado
  • python-sh/python2-sh
  • python2-gevent
  • stardict/stardict-lite
  • tcpflow
  • ibus-qt
  • stunnel

我在 aur-general 邮件列表处理了上百封(脑测的, 应该有吧?)邮件, 有关 AUR 包的删除/合并/Disown(这货怎么翻译呢)操作.

我在 IRC 里和 Arch 其他 TU/Dev 讨(tiao)论(xi)了各种奇怪的问(yong)题(hu).

我在 Arch Linux 中文社区… 参与折(wan)腾(huai)了一个 Minecraft 服务器 XD (咳咳)

我在 IRC #archlinux-cn 和百度贴吧 archlinux 吧回(tiao)答(xi)了各种奇怪的问(yong)题(hu).

(这篇本来打算跨年的时候写的, 不过各种懒拖到现在了…)

改坏了 sudo 的配置文件, 又没有办法切换到 root 用户? 也许 polkit 能救你!

今天帮基友折腾 Ubuntu 的时候, 修改 /etc/sudoers 不小心改坏了格式, 然后 sudo 提示 sudoers 格式不对无法运行, 然后各种泪目. 突然想到 polkit 直接调用 systemd (或者在较老的系统上调用 consolekit), 或许可以绕过 sudo 提权. 于是在终端敲下了:

$ pkexec bash

输入密码后果断进入了 root shell! 于是省去了一次重启改 init 然后 remount (或者插入安装盘 mount 等)的繁琐步骤…

希望可以帮到谁 XD

[Arch] 今日更新的 fcitx(-gtk2) 在 gtk2 应用中无法使用问题的解决与启示

今日更新了 fcitx, 许多用户反馈在部分应用程序中无法激活/使用, 虽然这类问题已经并不新鲜, 但是我觉得还是有必要说明一下.

首先, 这个问题从根本上是pacman的错(升级顺序混乱).

升级的时候你应该看到 fcitx-gtk2/fcitx-gtk3 的 installing 后面跟着个 error, 那就是因为, 存在下面的依赖链(以 fcitx-gtk2 为例):

fcitx-gtk2 -> gtk2 -> pango -> harfbuzz -> icu

最后的两个都在升级列表里, 而按照逻辑, fcitx-gtk2 需要在他们之后升级才是正常的, 但是 pacman 没有考虑这个问题(依赖链中间有两个未参与此次升级的包).

我今天中午收到反馈就 bump 了版本(在基友 yuyichao 的建议下更新了 fcitx-gtk2.install, 简单的 hack 了一下使得以后类似情况时不出现此问题), 现在你看到(或者装了)的应该是 -3 结尾的版本号. 但是即使升级后, 所有使用 gtk2 相关库的应用程序仍需重启才能生效.

因为类似情况并不是第一次出现了(以前有数次大规模 rebuild 后某些包不正常的情况), 基本上如果你在升级过程中看到有库链接错误/segfault/参数错误之类的提示, 在此次升级指令完成后把这些出错的包重新安装, 如果还有错, 继续安装有错的包直到没有错为止. 这样基本上可以解决大部分的此类问题.

另附此次我机子上 fcitx-gtk* 升级出错的 log 以便大家参考前文的分析 (无关包已去掉)

[2012-11-17 10:58] upgraded icu (49.1.2-2 -> 50.1-2)
[2012-11-17 10:58] upgraded fcitx (4.2.6.1-1 -> 4.2.6.1-2)
[2012-11-17 10:58] usr/bin/gtk-query-immodules-2.0: error while loading shared libraries: libicule.so.49: cannot open shared object file: No such file or directory
[2012-11-17 10:58] upgraded fcitx-gtk2 (4.2.6.1-1 -> 4.2.6.1-2)
[2012-11-17 10:58] usr/bin/gtk-query-immodules-3.0: error while loading shared libraries: libicule.so.49: cannot open shared object file: No such file or directory
[2012-11-17 10:58] upgraded fcitx-gtk3 (4.2.6.1-1 -> 4.2.6.1-2)
[2012-11-17 10:58] upgraded qt (4.8.3-5 -> 4.8.3-6)
[2012-11-17 10:58] upgraded fcitx-qt (4.2.6.1-1 -> 4.2.6.1-2)
[2012-11-17 10:58] upgraded harfbuzz (0.9.5-1 -> 0.9.5-2)

一句话检查自己 Arch 里装的 AUR 包是否和社区同步

我们知道 aurget yaourt 等工具可以解决普通升级的情况, 但是如果一个包改名了, 或者(不靠谱的)维护者降级了没加前置version, 这些工具不会给出任何提示. 如果没有关注自己使用的包的 comments (没有notify) 以及 aur-general 邮件列表的话, 常常会错过这样的信息, 以致自己机子上的包过期很久也没发现, 以后出现莫名其妙的问题什么的(

举例来说, aur/qtcreator-bin 被收入 [community] 一段时间了, 因为收入后改了名 (新名称是 qtcreator), 导致 yaourt 没有给我任何提示. 今天用下面的语句检查后我才发现, 自己机子里的 qtcreator-bin (版本2.3) 包已经不在 AUR 里了, 而[community-testing]/qtcreator 版本是2.6.0beta, 可见我这里的包已经过期许久.

和上次的小脚本一样, 我又用到了 GNU Parallel, 嗯就是这样(

pacman -Qmq | parallel 'ver=($(package-query {} -AQ -f "%l")); [[ "${ver[0]}" != "${ver[1]}" ]] && echo {} ${ver[0]} != ${ver[1]}'

记一次虚拟机装 FreeBSD 9 #坑爹

嗯还是忍不住把 #坑爹 放在了标题里, 这个…嗯有槽请轻吐什么的我才不知道呢(

虚拟机是 VirtualBox OSE 的最新版. (才不告诉你们为什么用OSE

首先呢, 作为一个 Arch 用户, 俺打开 FreeBSD 的网站看到 8.3 和 9.0 乃说我会下哪个呢? (喂喂

然后… 安装光盘引导到一半… 神马? mount 光驱 失败??!!

经过一番用力的Google总算找到了 这个帖子 , 原来是Chipset选的不对啊..喂喂VirtualBox乃都为每个操作系统改一些Presets了为啥不干脆把FreeBSD默认到ICH系列啊??!!

然后… 基本用默认配置连分区都没改安装到 ports, 挂了, 提示 out of inodes.

于是S&L大法启动, 重新引导安装进到分区修改界面按编辑… なに? 居然没有输入自定义选项的地方, 上网随手一搜大家的方法都坑爆了, 比如装到一半挂了重引导用dd还有什么一番折腾然后再手动完成剩下的安装过程(

后来呢… 后来还是找到对头的地方了, 这个帖子这个Issue 报告, 然后告诉我在9.1修了…

于是… 于是果然还是重新下了一个9.1的iso装上了嗯! (

然后心血来潮想装 virtualbox 的 guest additions (虽然现在想想不知道为什么以及有什么用 = =

然后按官网给的方法要自己make install, 然后告诉我没装src, 哦对确实没装src… 然后… 神马? “要装src请自己下载然后解压到/”, 喂喂这不是坑爹么在这guest里没有curl也没有wget好吧我不知道其他可能有的下东西的命令了 (

于是只好用给的另外一个方法(csup) 装上了src, 然后make install 到一半… 果然磁盘空间没了… df一看剩余空间居然是..负…的…..(超神了有木有!!

好吧VirtualBox我选FreeBSD乃建磁盘时默认给填容量2G啊坑我幸亏我看到安装光盘都不止2G(嘻嘻看我聪明吧)于是我给了4G然后果然… 还!!是!!不!!够!!啊!!!!!!!

于是… 从头再来装在一个8G的上面, 嗯这次总算靠谱了, 不过截止现场的消息, 从今天早上make install 到晚上11点, 目前仍然没有编译完依赖 (zZ2…

嗯没了 (喂喂这流水帐有点过分啊!

简单的 Arch 第三方软件源自动化同步上传工具

首先解释下, 这玩意是给包维护者用的, 不是给普通用户的(
功能: 扫描自己维护的包列表, 同步所有包到远程软件仓库. 自动判断architecture. 如使用 yaourt, 需要配置 yaourt 输出到 pacman 目录, 或者手动修改工具里的路径.
PKGLIST格式: 一行一个包名.
PS: 因为用到了 GNU Parallel, 所以记得装一下嗯(

packageupload:

#!/bin/bash
[[ "$1" = *x86_64* ]] && ARCH=x86_64 || ARCH=any
echo "Uploading $1 to repo, architecture: $ARCH"
rsync -azP $1 root@$SERVER_IP:/home/www/repo/$ARCH/

packagesync:

#!/bin/bash
cat /path/to/PKGLIST|xargs pacman -Q|sed -e "s/\\s/-/"|xargs -IQ bash -c "ls /var/cache/pacman/pkg/Q-*"|parallel packageupload
QR Code Business Card