Skip to content

Instantly share code, notes, and snippets.

@ttuanhung
Created September 10, 2020 12:00
Show Gist options
  • Select an option

  • Save ttuanhung/75c2cf80616a05ea3446ea58cc6d09ff to your computer and use it in GitHub Desktop.

Select an option

Save ttuanhung/75c2cf80616a05ea3446ea58cc6d09ff to your computer and use it in GitHub Desktop.

Revisions

  1. @slider23 slider23 revised this gist May 15, 2016. 1 changed file with 2 additions and 10 deletions.
    12 changes: 2 additions & 10 deletions readme.md
    Original file line number Diff line number Diff line change
    @@ -8,20 +8,12 @@ This script install and configure LEMP-environment for Ubuntu 16.04

    ####Software:

    Nginx
    PHP 7.0 with php7.0-fpm
    Mysql 5.7
    Redis
    Memcached
    Beanstalkd
    Node.js 5
    Supervisor
    Composer
    Fail2Ban
    Nginx, PHP 7.0 with php7.0-fpm, Mysql 5.7, Redis, Memcached, Beanstalkd, Node.js 5, Supervisor, Composer, Fail2Ban

    #####Settings:

    Open ports only: 22, 80, 443

    SSH password auth is disabled (only keys)


  2. @slider23 slider23 created this gist May 15, 2016.
    362 changes: 362 additions & 0 deletions install.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,362 @@

    # =================== YOUR DATA ========================

    SERVER_NAME="some-server-name"
    SERVER_IP="111.111.11.11"

    USER="someuser"
    SUDO_PASSWORD="secret-password-one"
    MYSQL_ROOT_PASSWORD="secret-password-two"

    # SSH access via password will be disabled. Use keys instead.
    PUBLIC_SSH_KEYS="# Home
    ssh-rsa AAAAB3NzaC1yc2EAAAA......
    # Notebook
    ssh-rsa AAAAB3NzaC1yc2EAAAA......
    # Work
    ssh-rsa AAAAB3NzaC1yc2EAAAA......"

    # if vps not contains swap file - create it
    SWAP_SIZE="1G"

    TIMEZONE="Etc/GMT+0" # lits of avaiable timezones: ls -R --group-directories-first /usr/share/zoneinfo

    # =================== LETS MAGIC BEGINS ================

    # Prefer IPv4 over IPv6 - make apt-get faster

    sudo sed -i "s/#precedence ::ffff:0:0\/96 100/precedence ::ffff:0:0\/96 100/" /etc/gai.conf

    # Upgrade The Base Packages

    apt-get update
    apt-get upgrade -y

    # Add A Few PPAs To Stay Current

    apt-get install -y --force-yes software-properties-common

    apt-add-repository ppa:nginx/development -y
    apt-add-repository ppa:chris-lea/redis-server -y
    apt-add-repository ppa:ondrej/apache2 -y
    apt-add-repository ppa:ondrej/php -y

    # Update Package Lists

    apt-get update

    # Base Packages

    apt-get install -y --force-yes build-essential curl fail2ban gcc git libmcrypt4 libpcre3-dev \
    make python2.7 python-pip supervisor ufw unattended-upgrades unzip whois zsh mc p7zip-full htop

    # Install Python Httpie

    pip install httpie

    # Disable Password Authentication Over SSH

    sed -i "/PasswordAuthentication yes/d" /etc/ssh/sshd_config
    echo "" | sudo tee -a /etc/ssh/sshd_config
    echo "" | sudo tee -a /etc/ssh/sshd_config
    echo "PasswordAuthentication no" | sudo tee -a /etc/ssh/sshd_config

    # Restart SSH

    ssh-keygen -A
    service ssh restart

    # Set The Hostname If Necessary

    echo "$SERVER_NAME" > /etc/hostname
    sed -i "s/127\.0\.0\.1.*localhost/127.0.0.1 $SERVER_NAME localhost/" /etc/hosts
    hostname $SERVER_NAME

    # Set The Timezone

    ln -sf /usr/share/zoneinfo/$TIMEZONE /etc/localtime

    # Create The Root SSH Directory If Necessary

    if [ ! -d /root/.ssh ]
    then
    mkdir -p /root/.ssh
    touch /root/.ssh/authorized_keys
    fi

    # Setup User

    useradd $USER
    mkdir -p /home/$USER/.ssh
    adduser $USER sudo

    # Setup Bash For User

    chsh -s /bin/bash $USER
    cp /root/.profile /home/$USER/.profile
    cp /root/.bashrc /home/$USER/.bashrc

    # Set The Sudo Password For User

    PASSWORD=$(mkpasswd $SUDO_PASSWORD)
    usermod --password $PASSWORD $USER

    # Build Formatted Keys & Copy Keys To User

    cat > /root/.ssh/authorized_keys << EOF
    $PUBLIC_SSH_KEYS
    EOF

    cp /root/.ssh/authorized_keys /home/$USER/.ssh/authorized_keys

    # Create The Server SSH Key

    ssh-keygen -f /home/$USER/.ssh/id_rsa -t rsa -N ''

    # Copy Github And Bitbucket Public Keys Into Known Hosts File

    ssh-keyscan -H github.com >> /home/$USER/.ssh/known_hosts
    ssh-keyscan -H bitbucket.org >> /home/$USER/.ssh/known_hosts

    # Setup Site Directory Permissions

    chown -R $USER:$USER /home/$USER
    chmod -R 755 /home/$USER
    chmod 700 /home/$USER/.ssh/id_rsa

    # Setup Unattended Security Upgrades

    cat > /etc/apt/apt.conf.d/50unattended-upgrades << EOF
    Unattended-Upgrade::Allowed-Origins {
    "Ubuntu xenial-security";
    };
    Unattended-Upgrade::Package-Blacklist {
    //
    };
    EOF

    cat > /etc/apt/apt.conf.d/10periodic << EOF
    APT::Periodic::Update-Package-Lists "1";
    APT::Periodic::Download-Upgradeable-Packages "1";
    APT::Periodic::AutocleanInterval "7";
    APT::Periodic::Unattended-Upgrade "1";
    EOF

    # Setup UFW Firewall

    ufw allow 22
    ufw allow 80
    ufw allow 443
    ufw --force enable

    # Allow FPM Restart

    echo "$USER ALL=NOPASSWD: /usr/sbin/service php7.0-fpm reload" > /etc/sudoers.d/php-fpm

    # Configure Supervisor Autostart

    systemctl enable supervisor.service
    service supervisor start

    # Configure Swap Disk

    if [ -f /swapfile ]; then
    echo "Swap exists."
    else
    fallocate -l $SWAP_SIZE /swapfile
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    echo "/swapfile none swap sw 0 0" >> /etc/fstab
    echo "vm.swappiness=30" >> /etc/sysctl.conf
    echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf
    fi

    # Install Base PHP Packages

    apt-get install -y --force-yes php7.0-cli php7.0-dev \
    php-sqlite3 php-gd \
    php-curl php7.0-dev \
    php-imap php-mysql php-memcached php-mcrypt php-mbstring \
    php-xml php-imagick php7.0-zip php7.0-bcmath php-soap \
    php7.0-intl php7.0-readline

    # Install Composer Package Manager

    curl -sS https://getcomposer.org/installer | php
    mv composer.phar /usr/local/bin/composer

    # Misc. PHP CLI Configuration

    sudo sed -i "s/error_reporting = .*/error_reporting = E_ALL/" /etc/php/7.0/cli/php.ini
    sudo sed -i "s/display_errors = .*/display_errors = On/" /etc/php/7.0/cli/php.ini
    sudo sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php/7.0/cli/php.ini
    sudo sed -i "s/;date.timezone.*/date.timezone = UTC/" /etc/php/7.0/cli/php.ini

    # Configure Sessions Directory Permissions

    chmod 733 /var/lib/php/sessions
    chmod +t /var/lib/php/sessions

    # Install Nginx & PHP-FPM

    apt-get install -y --force-yes nginx php7.0-fpm

    # Generate dhparam File

    openssl dhparam -out /etc/nginx/dhparams.pem 2048

    # Disable The Default Nginx Site

    rm /etc/nginx/sites-enabled/default
    rm /etc/nginx/sites-available/default
    service nginx restart

    # Tweak Some PHP-FPM Settings

    sed -i "s/error_reporting = .*/error_reporting = E_ALL/" /etc/php/7.0/fpm/php.ini
    sed -i "s/display_errors = .*/display_errors = On/" /etc/php/7.0/fpm/php.ini
    sed -i "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/" /etc/php/7.0/fpm/php.ini
    sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php/7.0/fpm/php.ini
    sed -i "s/;date.timezone.*/date.timezone = UTC/" /etc/php/7.0/fpm/php.ini
    sed -i "s/short_open_tag.*/short_open_tag = On/" /etc/php/7.0/fpm/php.ini

    # Setup Session Save Path

    sed -i "s/\;session.save_path = .*/session.save_path = \"\/var\/lib\/php5\/sessions\"/" /etc/php/7.0/fpm/php.ini
    sed -i "s/php5\/sessions/php\/sessions/" /etc/php/7.0/fpm/php.ini

    # Configure Nginx & PHP-FPM To Run As User

    sed -i "s/user www-data;/user $USER;/" /etc/nginx/nginx.conf
    sed -i "s/# server_names_hash_bucket_size.*/server_names_hash_bucket_size 64;/" /etc/nginx/nginx.conf
    sed -i "s/^user = www-data/user = $USER/" /etc/php/7.0/fpm/pool.d/www.conf
    sed -i "s/^group = www-data/group = $USER/" /etc/php/7.0/fpm/pool.d/www.conf
    sed -i "s/;listen\.owner.*/listen.owner = $USER/" /etc/php/7.0/fpm/pool.d/www.conf
    sed -i "s/;listen\.group.*/listen.group = $USER/" /etc/php/7.0/fpm/pool.d/www.conf
    sed -i "s/;listen\.mode.*/listen.mode = 0666/" /etc/php/7.0/fpm/pool.d/www.conf

    # Configure A Few More Server Things

    sed -i "s/;request_terminate_timeout.*/request_terminate_timeout = 60/" /etc/php/7.0/fpm/pool.d/www.conf
    sed -i "s/worker_processes.*/worker_processes auto;/" /etc/nginx/nginx.conf
    sed -i "s/# multi_accept.*/multi_accept on;/" /etc/nginx/nginx.conf

    # Install A Catch All Server

    cat > /etc/nginx/sites-available/catch-all << EOF
    server {
    return 404;
    }
    EOF

    ln -s /etc/nginx/sites-available/catch-all /etc/nginx/sites-enabled/catch-all

    cat > /etc/nginx/sites-available/example << EOF
    server {
    listen 80;
    server_name somedomain.com;
    root /home/$USER/somedomain.com/public;
    index index.html index.htm index.php;
    charset utf-8;
    location / {
    try_files $uri $uri/ /index.php?$query_string;
    }
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt { access_log off; log_not_found off; }
    access_log off;
    error_log /var/log/nginx/somedomain.com-error.log error;
    error_page 404 /index.php;
    location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    }
    location ~ /\.ht {
    deny all;
    }
    }
    EOF

    # Restart Nginx & PHP-FPM Services

    if [ ! -z "\$(ps aux | grep php-fpm | grep -v grep)" ]
    then
    service php7.0-fpm restart
    fi

    service nginx restart
    service nginx reload

    # Add User To www-data Group

    usermod -a -G www-data $USER
    id $USER
    groups $USER

    # Install Node.js

    curl --silent --location https://deb.nodesource.com/setup_5.x | bash -

    apt-get update

    sudo apt-get install -y --force-yes nodejs

    npm install -g pm2
    npm install -g gulp

    # Set The Automated Root Password

    export DEBIAN_FRONTEND=noninteractive

    debconf-set-selections <<< "mysql-community-server mysql-community-server/data-dir select ''"
    debconf-set-selections <<< "mysql-community-server mysql-community-server/root-pass password $MYSQL_ROOT_PASSWORD"
    debconf-set-selections <<< "mysql-community-server mysql-community-server/re-root-pass password $MYSQL_ROOT_PASSWORD"

    # Install MySQL

    apt-get install -y mysql-server

    # Configure Password Expiration

    echo "default_password_lifetime = 0" >> /etc/mysql/mysql.conf.d/mysqld.cnf

    # Configure Access Permissions For Root & User

    sed -i '/^bind-address/s/bind-address.*=.*/bind-address = */' /etc/mysql/mysql.conf.d/mysqld.cnf
    mysql --user="root" --password="$MYSQL_ROOT_PASSWORD" -e "GRANT ALL ON *.* TO root@'$SERVER_IP' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD';"
    mysql --user="root" --password="$MYSQL_ROOT_PASSWORD" -e "GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD';"
    service mysql restart

    mysql --user="root" --password="$MYSQL_ROOT_PASSWORD" -e "CREATE USER '$USER'@'$SERVER_IP' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD';"
    mysql --user="root" --password="$MYSQL_ROOT_PASSWORD" -e "GRANT ALL ON *.* TO '$USER'@'$SERVER_IP' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD' WITH GRANT OPTION;"
    mysql --user="root" --password="$MYSQL_ROOT_PASSWORD" -e "GRANT ALL ON *.* TO '$USER'@'%' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD' WITH GRANT OPTION;"
    mysql --user="root" --password="$MYSQL_ROOT_PASSWORD" -e "FLUSH PRIVILEGES;"

    # Install & Configure Redis Server

    apt-get install -y redis-server
    sed -i 's/bind 127.0.0.1/bind 0.0.0.0/' /etc/redis/redis.conf
    service redis-server restart

    # Install & Configure Memcached

    apt-get install -y memcached
    sed -i 's/-l 127.0.0.1/-l 0.0.0.0/' /etc/memcached.conf
    service memcached restart

    # Install & Configure Beanstalk

    apt-get install -y --force-yes beanstalkd
    sed -i "s/BEANSTALKD_LISTEN_ADDR.*/BEANSTALKD_LISTEN_ADDR=0.0.0.0/" /etc/default/beanstalkd
    sed -i "s/#START=yes/START=yes/" /etc/default/beanstalkd
    /etc/init.d/beanstalkd start
    27 changes: 27 additions & 0 deletions readme.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,27 @@
    This script install and configure LEMP-environment for Ubuntu 16.04

    1. Create VPS
    2. Login as root
    3. Download `install.sh`
    4. `chmod 700 install.sh`
    5. `bash ./install.sh`

    ####Software:

    Nginx
    PHP 7.0 with php7.0-fpm
    Mysql 5.7
    Redis
    Memcached
    Beanstalkd
    Node.js 5
    Supervisor
    Composer
    Fail2Ban

    #####Settings:

    Open ports only: 22, 80, 443
    SSH password auth is disabled (only keys)