#!/bin/bash # Usable tylemp.sh on Debian 11. # Version: Stable-20220118 # Change log 20211114: change php-dom to php-xml and change php-mysqlnd to phpmysql # Change log 20220118: add php module: imagick, zip # Change log 20220118: change cache ttl from 30 days to 365 days; add cache for fonts # Change log 20220118: remove carbon forum; remove phpmyadmin; # Change log 20220118: add client_max_body_size to nginx config file of rainloop function get_phpsockpath() { # get the path of php socks file phpsockpath="$(ls /run/php/php*.sock | head -n 1)" } function check_install() { if [ -z "$(which "$1" 2>/dev/null)" ]; then executable=$1 shift while [ -n "$1" ]; do DEBIAN_FRONTEND=noninteractive apt-get -q -y install "$1" print_info "$1 installed for $executable" shift done else print_warn "$2 already installed" fi } function check_remove() { if [ -n "$(which "$1" 2>/dev/null)" ]; then DEBIAN_FRONTEND=noninteractive apt-get -q -y remove --purge "$2" print_info "$2 removed" else print_warn "$2 is not installed" fi } function check_sanity() { # Do some sanity checking. if [ $(/usr/bin/id -u) != "0" ]; then die 'Must be run by root user' fi if [ ! -f /etc/debian_version ]; then die "Distribution is not supported" fi } function die() { echo "ERROR: $1" >/dev/null 1>&2 exit 1 } function get_domain_name() { # Getting rid of the lowest part. domain=${1%.*} lowest=$(expr "$domain" : '.*\.\([a-z][a-z]*\)') case "$lowest" in com | net | org | gov | edu | co) domain=${domain%.*} ;; esac lowest=$(expr "$domain" : '.*\.\([a-z][a-z]*\)') [ -z "$lowest" ] && echo "$domain" || echo "$lowest" } function get_password() { # Check whether our local salt is present. SALT=/var/lib/radom_salt if [ ! -f "$SALT" ]; then head -c 512 /dev/urandom >"$SALT" chmod 400 "$SALT" fi password=$( ( cat "$SALT" echo $1 ) | md5sum | base64) echo ${password:0:13} } function install_dash() { check_install dash dash rm -f /bin/sh ln -s dash /bin/sh } function install_sshd() { check_install ssd openssh-server } function install_exim4() { check_install mail exim4 if [ -f /etc/exim4/update-exim4.conf.conf ]; then sed -i \ "s/dc_eximconfig_configtype='local'/dc_eximconfig_configtype='internet'/" \ /etc/exim4/update-exim4.conf.conf invoke-rc.d exim4 restart fi } function install_mysql() { # Install the MariaDB packages check_install mysqld mariadb-server check_install mysql mariadb-client invoke-rc.d mysql stop # all the related files. cat >/etc/mysql/conf.d/actgod.cnf <<END [mysqld] key_buffer_size = 8M query_cache_size = 0 END invoke-rc.d mysql start # Generating a new password for the root user. passwd=$(get_password root@mysql) mysqladmin password "$passwd" cat >~/.my.cnf <<END [client] user = root password = $passwd END chmod 600 ~/.my.cnf } function install_nginx() { check_install nginx nginx # Need to increase the bucket size for Debian 5. if [ ! -d /etc/nginx ]; then mkdir /etc/nginx fi if [ ! -d /etc/nginx/conf.d ]; then mkdir /etc/nginx/conf.d fi sed -i s/'^worker_processes [0-9];'/'worker_processes 1;'/g /etc/nginx/nginx.conf sed -i s/'^user nginx;'/'user www-data;'/g /etc/nginx/nginx.conf sed -i s/'# gzip_'/'gzip_'/g /etc/nginx/nginx.conf invoke-rc.d nginx restart if [ ! -d /var/www ]; then mkdir /var/www fi cat >/etc/nginx/proxy.conf <<EXND proxy_connect_timeout 30s; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 32k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_redirect off; proxy_hide_header Vary; proxy_set_header Accept-Encoding ''; proxy_set_header Host \$host; proxy_set_header Referer \$http_referer; proxy_set_header Cookie \$http_cookie; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; EXND } function install_php() { service mysql stop service nginx stop apt-get -q -y install php-fpm php-mysql php-gd php-tidy php-curl git curl zip unzip php-xml php-mbstring php-imagick php-zip service mysql start service nginx start } function install_syslogd() { # We just need a simple vanilla syslogd. Also there is no need to log to # so many files (waste of fd). Just dump them into # /var/log/(cron/mail/messages) check_install /usr/sbin/syslogd inetutils-syslogd invoke-rc.d inetutils-syslogd stop for file in /var/log/*.log /var/log/mail.* /var/log/debug /var/log/syslog; do [ -f "$file" ] && rm -f "$file" done for dir in fsck news; do [ -d "/var/log/$dir" ] && rm -rf "/var/log/$dir" done cat >/etc/syslog.conf <<END *.*;mail.none;cron.none -/var/log/messages cron.* -/var/log/cron mail.* -/var/log/mail END [ -d /etc/logrotate.d ] || mkdir -p /etc/logrotate.d cat >/etc/logrotate.d/inetutils-syslogd <<END /var/log/cron /var/log/mail /var/log/messages { rotate 4 weekly missingok notifempty compress sharedscripts postrotate /etc/init.d/inetutils-syslogd reload >/dev/null endscript } END invoke-rc.d inetutils-syslogd start } function install_vhost() { check_install wget wget if [ -z "$1" ]; then die "Usage: $(basename $0) vhost <hostname>" fi if [ ! -d /var/www ]; then mkdir /var/www fi mkdir "/var/www/$1" chown -R www-data "/var/www/$1" chmod -R 755 "/var/www/$1" # Setting up Nginx mapping cat >"/etc/nginx/conf.d/$1.conf" <<END server { server_name $1; root /var/www/$1; location / { index index.html index.htm; } } END invoke-rc.d nginx reload cat >"/var/www/$1/index.html" <<END Hello world! ----$2 END invoke-rc.d nginx reload } function install_dhost() { check_install wget wget if [ ! -d /var/www ]; then mkdir /var/www fi if [ -z "$1" ]; then die "Usage: $(basename $0) dhost <hostname>" fi mkdir "/var/www/$1" chown -R www-data "/var/www/$1" chmod -R 755 "/var/www/$1" # Setting up Nginx mapping cat >"/etc/nginx/conf.d/$1.conf" <<END server { listen 80; server_name $1; index index.html index.htm index.php default.html default.htm default.php; root /var/www/$1; location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { try_files \$uri =404; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; include fastcgi_params; fastcgi_pass unix:tianyiphpsockpath; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 30d; } } END get_phpsockpath sed -i s#tianyiphpsockpath#$phpsockpath#g /etc/nginx/conf.d/$1.conf invoke-rc.d nginx reload } function install_typecho() { check_install wget wget if [ ! -d /var/www ]; then mkdir /var/www fi if [ -z "$1" ]; then die "Usage: $(basename $0) typecho <hostname>" fi # Downloading the typecho' latest and greatest distribution. mkdir /tmp/typecho.$$ wget -O - "http://typecho.org/downloads/1.1-17.10.30-release.tar.gz" | tar zxf - -C /tmp/typecho.$$ mv /tmp/typecho.$$/build/ "/var/www/$1" rm -rf /tmp/typecho.$$ chown -R www-data "/var/www/$1" chmod -R 755 "/var/www/$1" # Setting up the MySQL database dbname=$(echo $1 | tr . _) userid=$(get_domain_name $1) # MySQL userid cannot be more than 15 characters long userid="${dbname:0:15}" passwd=$(get_password "$userid@mysql") mysqladmin create "$dbname" echo "GRANT ALL PRIVILEGES ON \`$dbname\`.* TO \`$userid\`@localhost IDENTIFIED BY '$passwd';" | mysql # Setting up Nginx mapping cat >"/etc/nginx/conf.d/$1.conf" <<'END' server { listen 80; server_name tydomain; index index.html index.htm index.php default.html default.htm default.php; root /var/www/tydomain; ## 支持伪静态 location / { index index.html index.php; if (-f $request_filename/index.html) { rewrite (.*) $1/index.html break; } if (-f $request_filename/index.php) { rewrite (.*) $1/index.php; } if (!-f $request_filename) { rewrite (.*) /index.php; } } location ~ .*\.php(\/.*)*$ { fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_pass unix:tianyiphpsockpath; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ { expires 365d; } location ~ .*\.(js|css|woff|woff2|ttf)?$ { expires 365d; } } END sed -i s/tydomain/$1/g /etc/nginx/conf.d/$1.conf get_phpsockpath sed -i s#tianyiphpsockpath#$phpsockpath#g /etc/nginx/conf.d/$1.conf invoke-rc.d nginx reload cat >>"/root/$1.mysql.txt" <<END [typecho_myqsl] dbname = $dbname username = $userid password = $passwd END echo "mysql dataname:" $dbname echo "mysql username:" $userid echo "mysql passwd:" $passwd } function install_wordpress_en() { check_install wget wget if [ -z "$1" ]; then die "Usage: $(basename $0) wordpress <hostname>" fi # Downloading the WordPress' latest and greatest distribution. mkdir /tmp/wordpress.$$ wget -O - http://wordpress.org/latest.tar.gz | tar zxf - -C /tmp/wordpress.$$ mv /tmp/wordpress.$$/wordpress "/var/www/$1" rm -rf /tmp/wordpress.$$ chown -R www-data "/var/www/$1" chmod -R 755 "/var/www/$1" # Setting up the MySQL database dbname=$(echo $1 | tr . _) userid=$(get_domain_name $1) # MySQL userid cannot be more than 15 characters long userid="${dbname:0:15}" passwd=$(get_password "$userid@mysql") cp "/var/www/$1/wp-config-sample.php" "/var/www/$1/wp-config.php" sed -i "s/database_name_here/$dbname/; s/username_here/$userid/; s/password_here/$passwd/" \ "/var/www/$1/wp-config.php" sed -i "31a define(\'WP_CACHE\', true);" "/var/www/$1/wp-config.php" chown -R www-data "/var/www/$1" mysqladmin create "$dbname" echo "GRANT ALL PRIVILEGES ON \`$dbname\`.* TO \`$userid\`@localhost IDENTIFIED BY '$passwd';" | mysql # Setting up Nginx mapping cat >"/etc/nginx/conf.d/$1.conf" <<END server { listen 80; server_name $1; index index.html index.htm index.php default.html default.htm default.php; root /var/www/$1; location / { try_files \$uri \$uri/ /index.php; } location ~ \.php$ { try_files \$uri =404; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; include fastcgi_params; fastcgi_pass unix:tianyiphpsockpath; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ { expires 365d; } location ~ .*\.(js|css|woff|woff2|ttf)?$ { expires 365d; } $al } END get_phpsockpath sed -i s#tianyiphpsockpath#$phpsockpath#g /etc/nginx/conf.d/$1.conf cat >>"/root/$1.mysql.txt" <<END [wordpress_myqsl] dbname = $dbname username = $userid password = $passwd END invoke-rc.d nginx reload } function install_rainloop() { check_install wget wget check_install bsdtar bsdtar if [ -z "$1" ]; then die "Usage: $(basename $0) rainloop <hostname>" fi # Downloading the Rainloop' latest and greatest distribution. mkdir /tmp/rainloop.$$ wget -O - http://repository.rainloop.net/v2/webmail/rainloop-latest.zip | bsdtar xf - -C /tmp/rainloop.$$ mv /tmp/rainloop.$$ "/var/www/$1" rm -rf /tmp/rainloop.$$ cat >"/var/www/$1/.htaccess" <<END php_value upload_max_filesize 8m php_value post_max_size 25m END chown -R www-data "/var/www/$1" chmod -R 755 "/var/www/$1" # # Setting up the MySQL database dbname=$(echo $1 | tr . _) userid=$(get_domain_name $1) # MySQL userid cannot be more than 15 characters long userid="${dbname:0:15}" passwd=$(get_password "$userid@mysql") mysqladmin create "$dbname" echo "GRANT ALL PRIVILEGES ON \`$dbname\`.* TO \`$userid\`@localhost IDENTIFIED BY '$passwd';" | mysql # Setting up Nginx mapping cat >"/etc/nginx/conf.d/$1.conf" <<END server { listen 80; server_name $1; index index.html index.htm index.php default.html default.htm default.php; root /var/www/$1; client_max_body_size 25m; location / { try_files \$uri \$uri/ /index.php; } location ~ \.php$ { try_files \$uri =404; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; include fastcgi_params; fastcgi_pass unix:tianyiphpsockpath; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ { expires 365d; } location ~ .*\.(js|css|woff|woff2|ttf)?$ { expires 365d; } $al } END get_phpsockpath sed -i s#tianyiphpsockpath#$phpsockpath#g /etc/nginx/conf.d/$1.conf cat >>"/root/$1.mysql.txt" <<END [rainloop_myqsl] dbname = $dbname username = $userid password = $passwd END invoke-rc.d nginx reload } function print_info() { echo -n -e '\e[1;36m' echo -n $1 echo -e '\e[0m' } function print_warn() { echo -n -e '\e[1;33m' echo -n $1 echo -e '\e[0m' } function check_version() { cat /etc/issue | grep "Linux 5" if [ $? -ne 0 ]; then cat >/etc/init.d/vzquota <<EndFunc #!/bin/sh ### BEGIN INIT INFO # Provides: vzquota # Required-Start: # Required-Stop: # Should-Start: $local_fs $syslog # Should-Stop: $local_fs $syslog # Default-Start: 0 1 2 3 4 5 6 # Default-Stop: # Short-Description: Fixed(?) vzquota init script ### END INIT INFO EndFunc fi } function remove_unneeded() { # Some Debian have portmap installed. We don't need that. check_remove /sbin/portmap portmap # Remove rsyslogd, which allocates ~30MB privvmpages on an OpenVZ system, # which might make some low-end VPS inoperatable. We will do this even # before running apt-get update. check_remove /usr/sbin/rsyslogd rsyslog # Other packages that seem to be pretty common in standard OpenVZ # templates. check_remove /usr/sbin/apache2 'apache2*' check_remove /usr/sbin/named bind9 check_remove /usr/sbin/smbd 'samba*' check_remove /usr/sbin/nscd nscd # Need to stop sendmail as removing the package does not seem to stop it. if [ -f /usr/lib/sm.bin/smtpd ]; then invoke-rc.d sendmail stop check_remove /usr/lib/sm.bin/smtpd 'sendmail*' fi } function update_stable() { apt-get -q -y update apt-get -q -y upgrade apt-get -q -y dist-upgrade apt-get -y install libc6 perl debconf dialog bsdutils apt-get -y install apt apt-utils dselect dpkg #~ apt-get -q -y upgrade } function update_nginx() { apt-get -q -y update invoke-rc.d nginx stop apt-get -q -y remove nginx apt-get -q -y install nginx if [ ! -d /etc/nginx ]; then mkdir /etc/nginx fi if [ ! -d /etc/nginx/conf.d ]; then mkdir /etc/nginx/conf.d fi cat >/etc/nginx/conf.d/actgod.conf <<END client_max_body_size 20m; server_names_hash_bucket_size 64; END sed -i s/'^worker_processes [0-9];'/'worker_processes 1;'/g /etc/nginx/nginx.conf invoke-rc.d nginx restart if [ ! -d /var/www ]; then mkdir /var/www fi cat >/etc/nginx/proxy.conf <<EXND proxy_connect_timeout 30s; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 32k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_redirect off; proxy_hide_header Vary; proxy_set_header Accept-Encoding ''; proxy_set_header Host \$host; proxy_set_header Referer \$http_referer; proxy_set_header Cookie \$http_cookie; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; EXND invoke-rc.d nginx restart } ######################################################################## # START OF PROGRAM ######################################################################## export PATH=/bin:/usr/bin:/sbin:/usr/sbin function tyinstall() { check_sanity case "$1" in exim4) install_exim4 ;; mysql) install_mysql ;; nginx) install_nginx ;; php) install_php ;; system) check_version remove_unneeded update_stable install_dash install_syslogd ;; typecho) install_typecho $2 ;; dhost) install_dhost $2 ;; vhost) install_vhost $2 ;; wordpress) install_wordpress_en $2 ;; rainloop) install_rainloop $2 ;; stable) check_version remove_unneeded update_stable install_dash install_syslogd install_sshd install_exim4 install_mysql install_nginx install_php ;; updatenginx) update_nginx ;; sshport) sed -i '/^Port [0-9]*/d' /etc/ssh/sshd_config sed -i '$a\Port Tianyitemp' /etc/ssh/sshd_config sed -i s/Tianyitemp/$2/g /etc/ssh/sshd_config echo "Port change successfully! The current port is $2" invoke-rc.d nginx restart ;; addnginx) sed -i s/'^worker_processes [0-9];'/'worker_processes Tianyitemp;'/g /etc/nginx/nginx.conf sed -i s/Tianyitemp/$2/g /etc/nginx/nginx.conf invoke-rc.d nginx restart ;; ssh) cat >>/etc/shells <<END /sbin/nologin END useradd $2 -s /sbin/nologin echo $2:$3 | chpasswd ;; *) echo 'Usage:' $(basename $0) '[option]' echo 'Available option:' for option in system exim4 mysql nginx php wordpress rainloop ssh addnginx stable dhost vhost sshport; do echo ' -' $option done ;; esac } tyinstall $1 $2 $3 | tee -a /tmp/tylemp.log