制作MacOS安装ISO/光盘映像文件

昨天,想要在家庭服务器上黑苹果,先是破解ESXi,添加了MaxOS描述文件。
现在需要准备MacOS安装ISO,忽然发现家里的30Mb光纤下载7GB的文件还是需要很久滴。
忽然想起,上次更新 MacBook Pro 好像没有删除安装文件,那么,直接在本地转换安装文件为ISO映像吧,只要区区几分钟就搞定。

#!/bin/bash
#

# Create the Blank ISO Image of 6GB with a Single Partition - Apple Partition Map
hdiutil create -o /tmp/Mojave -size 6g -layout SPUD -fs HFS+J -type SPARSE

# Mount the Blank Sparse Image
hdiutil attach /tmp/Mojave.sparseimage -noverify -nobrowse -mountpoint /Volumes/install_build

# Create the installer image
sudo ./Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia --volume /Volumes/install_build --nointeraction

# Give the installer image an icon
cp "./Install macOS Mojave.app/Contents/Resources/InstallAssistant.icns" "/Volumes/Install macOS Mojave/.VolumeIcon.icns"
SetFile -a C "/Volumes/Install macOS Mojave/"

# Unmount the Install Image
hdiutil detach /Volumes/Install\ macOS\ Mojave

# Resize the SparseImage to its minimum
#hdiutil compact /tmp/Mojave.sparseimage
#hdiutil resize -size min /tmp/Mojave.sparseimage

# Convert the Sparse Image to ISO/CD
hdiutil convert /tmp/Mojave.sparseimage -format UDTO -o /tmp/Mojave

# Rename the ISO Image and move it to the desktop
mv /tmp/Mojave.cdr ~/Desktop/Mojave.iso
rm /tmp/Mojave.sparseimage

MacOS安装Cocoapods的填坑之旅

今天接到一个任务,部署一套iOS-App开发环境,需要用到CocoaPods。

这还不是手到擒来?首先从AppStore安装Xcode,然后运行命令安装CocoaPods即可。

可是意外来的太快,按照官方的命令根本无法安装,各种报错,其中郁闷不足为外人道~~

整理最终命令如下:

# 设置中国源
gem sources --remove https://rubygems.org/
gem sources --add https://gems.ruby-china.org/
# 更新gem系统
sudo gem update --system
# 指定安装环境
sudo gem install -n /usr/local/bin cocoapods

解决iOS拍照上传图片旋转问题

html5应用,可以直接使用file功能调用相机拍照并上传,但是在iOS上有个奇葩的问题,图片不会自动翻转,上传到服务器上的图片可能是倒立的。

解决此问题有2种思路:

1.使用客户端JS检测图片信息,旋转后再上传。此方法实现需消耗客户端资源。

懒得整理js代码了,暂时按下不表。

2.使用服务端PHP检测图片信息,旋转后保存。此方法需要消耗少量的服务器资源。

function correct_image_orientation($target) {
    if(!function_exists('exif_read_data')) {
        return false;
    }
    $exif = exif_read_data($target);
    if($exif && isset($exif['Orientation']) && $exif['Orientation'] != 1) {
        switch ($exif['Orientation']) {
            case 3: $deg = 180; break;
            case 6: $deg = 270; break;
            case 8: $deg = 90; break;
            default: $deg = 0;
        }
        if($deg > 0) {
            $img = imagecreatefromjpeg($target);
            $img = imagerotate($img, $deg, 0);
            imagejpeg($img, $target, 95);
        }
    }
}

使用nginx-image-filter缩放或裁切图片

在编译Nginx时,记得增加http_image_filter模块,然后在server区域加入如下代码即可。
如果你懒得编译这个模块,也可以下载我编译好的Webox直接安装。

#生成缩略图(等比例)
#http://www.anrip.com/expamle/test.jpg?r128x128
if ($args ~ ^r\d+x\d+$) {
    rewrite ^(.+)$ $1/$args? last;
}
location ~* \.(gif|png|jpg|jpeg)/r(\d+)x(\d+)$ {
    rewrite ^(.+)/r(\d+)x(\d+)$ $1 break;
    image_filter resize  $2 $3;
    image_filter_buffer  10M;
}
#生成裁切图片(固定高宽)
#http://www.anrip.com/expamle/test.jpg?c128x128
if ($args ~ ^c\d+x\d+$) {
    rewrite ^(.+)$ $1/$args? last;
}
location ~* \.(gif|png|jpg|jpeg)/c(\d+)x(\d+)$ {
    rewrite ^(.+)/c(\d+)x(\d+)$ $1 break;
    image_filter crop  $2 $3;
    image_filter_buffer  10M;
}

Ubuntu安装新版NodeJS

Ubuntu发行版中NodeJs版本低的吓人,几乎没法正常使用。当然我们也有很多种方法可以安装NodeJS,但多多少少都有些麻烦,对于我这种懒人来讲,最好能几行命令完事儿。

nver=v10.15.3

# download the binary
wget https://nodejs.org/dist/${nver}/node-${nver}-linux-x64.tar.gz
tar xvf node-${nver}-linux-x64.tar.gz

# install to /usr/local
rm node-${nver}-linux-x64/{*.md,LICENSE}
cp -av node-${nver}-linux-x64/* /usr/local
rm -rf node-${nver}-linux-*

使用Munin监控多台服务器状态

一、安装服务端和监控节点

1、安装服务端 aptitude install munin

2、安装监控节点 aptitude install munin-node 可以在多台不同服务器上安装

二、配置服务端

1、编辑配置文件/etc/munin/munin.conf,注释掉默认节点[localhost.*]

2、添加节点配置/etc/munin/munin-conf.d/nodes

[srv005]
    address 12.35.67.5
    use_node_name yes
[srv006]
    address 12.35.67.6
    use_node_name yes
[srv007]
    address 12.35.67.7
    use_node_name yes

三、配置节点

编辑配置文件/etc/munin/munin-node.conf

allow ^12\.35\.67\.9$

使用SFTP完全替代FTP设置详解

由于FTP协议使用明文传输密码,我们通常建议用户改为使用SFTP,且设置Chroot目录,禁止登录Shell,以提高服务器安全性。
当然,很多优秀的FTP服务器都已经支持加密,但如果服务器上已有SSH服务,我们完全可以使用SFTP来传输数据,何必要多开一个进程和端口呢?

1,修改配置文件 /etc/ssh/sshd_config

#启用internal-sftp
Subsystem sftp internal-sftp
#限制用户的根目录
Match User ftp-user
ForceCommand internal-sftp
ChrootDirectory /var/ftproot

2,重启ssh服务即可

特别注意
ChrootDirectory 设置的目录权限及其所有的上级文件夹权限,属主和属组必须是root,权限最大设置只能是755。

OpenWRT之数据包原路发回(多出口策略路由)

PS:请自行安装软件包 ip-full

eth0: 内网接口0
eth1: 外网线路1
eth2: 外网线路2

# 创建路由表
echo "51 way1" >> /etc/iproute2/rt_tables
echo "52 way2" >> /etc/iproute2/rt_tables
# 设置线路二
ip route flush table way1
ip route add 172.16.1.0/24 dev eth0 scope link table way1
ip route add 11.11.11.0/24 dev eth1 scope link table way1
ip route add 22.22.22.0/24 dev eth2 scope link table way1
ip route add default via 11.11.11.1 dev eth1 table way1
ip rule add from 11.11.11.11 pref 101 table way1
# 设置线路一
ip route flush table way2
ip route add 172.16.1.0/24 dev eth0 scope link table way2
ip route add 11.11.11.0/24 dev eth1 scope link table way2
ip route add 22.22.22.0/24 dev eth2 scope link table way2
ip route add default via 22.22.22.1 dev eth2 table way2
ip rule add from 22.22.22.22 pref 102 table way2
# 刷新路由缓存
ip route flush cache

至此无论是way1还是way2,访问2个ip的任意一个地址都能够连通了。
即便是服务器上本身的默认路由都没有设置,也能够让外面的用户正常访问。

以下为相关参考指令:

# 指定IP出口
ip rule add from 172.16.1.5 pref 201 table way1
ip rule add from 172.16.1.6 pref 202 table way2
# 删除IP规则
ip rule del table pref 201 way1
ip rule del table pref 202 way2

Ubuntu安装Docker/Redmine/GitLab教程

兴趣所致,使用Docker部署下Redmine和GitLab,体验下Docker的魅力。

一、安装Docker

二、安装Redmie

地址 http://172.20.1.15
账号 admin
密码 admin

三、安装Gitlab

地址 http://172.20.1.16
账号 root
密码 5iveL!fe

集成安装脚本

PS1:安全起见,以下绑定的地址均为本地IP,无法对外提供服务,如需部署到服务器请酌情修改。
PS2:也可以安装 rinetd 软件包,实现任意端口转发。

请下载下面的集成安装脚本,修改password和email参数后,一键安装Redmine/GitLab吧~

#!/bin/bash
#
# Author  Anrip <mail@anrip.com>
# Website http://www.anrip.com/post/1811
# Refs https://github.com/sameersbn/docker-gitlab
# Refs https://github.com/sameersbn/docker-redmine
#

if [ ! `which docker` ]; then
    wget -qO- https://get.docker.com/ | sh
fi

docker network create --subnet=172.20.1.0/24 docker1

docker pull sameersbn/redis:latest
docker pull sameersbn/mysql:latest
docker pull sameersbn/gitlab:latest
docker pull sameersbn/redmine:latest

docker run --name app-redis -d \
    --net docker1 --ip 172.20.1.11 \
    --volume /srv/app-redis:/var/lib/redis \
    sameersbn/redis:latest

docker run --name app-mysql -d \
    --net docker1 --ip 172.20.1.12 \
    --env 'MYSQL_CHARSET=utf8' \
    --env 'MYSQL_COLLATION=utf8_general_ci' \
    --env 'DB_REMOTE_ROOT_NAME=root' \
    --env 'DB_REMOTE_ROOT_PASS=password' \
    --volume /srv/app-mysql:/var/lib/mysql \
    sameersbn/mysql:latest

MYSQL_CHARSET="DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci"
cat > /opt/app-mysql/init.sql <<EOF
    CREATE USER 'gitlab'@'%.%.%.%' IDENTIFIED BY 'password';
    CREATE DATABASE IF NOT EXISTS gitlabhq_production ${MYSQL_CHARSET};
    GRANT ALL PRIVILEGES ON \`gitlabhq_production\`.* TO 'gitlab'@'%.%.%.%';
    CREATE USER 'redmine'@'%.%.%.%' IDENTIFIED BY 'password';
    CREATE DATABASE IF NOT EXISTS redmine_production ${MYSQL_CHARSET};
    GRANT ALL PRIVILEGES ON \`redmine_production\`.* TO 'redmine'@'%.%.%.%';
EOF

sleep 30
docker exec -it app-mysql mysql "-e source /var/lib/mysql/init.sql"
rm -rf /opt/app-mysql/init.sql

docker run --name app-redmine -d \
    --net docker1 --ip 172.20.1.15 \
    --env 'REDMINE_PORT=80' \
    --env 'REDMINE_RELATIVE_URL_ROOT=/redmine' \
    --env 'SMTP_DOMAIN=anrip.com' \
    --env 'SMTP_HOST=smtp.exmail.qq.com' \
    --env 'SMTP_PORT=587' \
    --env 'SMTP_USER=team@anrip.com' \
    --env 'SMTP_PASS=anrip.2010' \
    --env='DB_ADAPTER=mysql2' \
    --env 'DB_HOST=172.20.1.12' \
    --env='DB_NAME=redmine_production' \
    --env 'DB_USER=redmine' \
    --env 'DB_PASS=password' \
    --volume /opt/app-redmine:/home/redmine/data \
    sameersbn/redmine:latest

docker run --name app-gitlab -d \
    --net docker1 --ip 172.20.1.16 \
    --env 'GITLAB_SSH_PORT=22' \
    --env 'GITLAB_PORT=80' \
    --env 'GITLAB_HOST=team.vmlu.com' \
    --env 'GITLAB_RELATIVE_URL_ROOT=/gitlab' \
    --env 'GITLAB_EMAIL=team@anrip.com' \
    --env 'GITLAB_EMAIL_DISPLAY_NAME=Vmlu Team' \
    --env 'GITLAB_SECRETS_DB_KEY_BASE=your-db-key-base' \
    --env 'GITLAB_SECRETS_SECRET_KEY_BASE=your-secert-key-base' \
    --env 'GITLAB_SECRETS_OTP_KEY_BASE=your-opt-key-base' \
    --env 'GITLAB_USERNAME_CHANGE=false' \
    --env 'UNICORN_TIMEOUT=120' \
    --env 'SMTP_DOMAIN=anrip.com' \
    --env 'SMTP_HOST=smtp.exmail.qq.com' \
    --env 'SMTP_PORT=587' \
    --env 'SMTP_USER=your@anrip.com' \
    --env 'SMTP_PASS=your-mail-pasowrd' \
    --env 'REDIS_HOST=172.20.1.11' \
    --env 'REDIS_PORT=6379' \
    --env 'DB_ADAPTER=mysql2' \
    --env 'DB_HOST=172.20.1.12' \
    --env 'DB_NAME=gitlabhq_production' \
    --env 'DB_USER=gitlab' \
    --env 'DB_PASS=password' \
    --volume /opt/app-gitlab:/home/git/data \
    sameersbn/gitlab:latest

#sudo aptitude install -y rinetd
#sudo echo "12.34.56.78 22 172.20.1.16 22" >>/etc/rinetd.conf