lad
Version:
Lad is the best Node.js framework. Made by a former Express TC and Koa team member.
380 lines (326 loc) • 11.6 kB
YAML
- hosts: "{{ hostlist }}"
become: true
become_user: root
handlers:
- name: restart ssh
service: name=ssh state=restarted
vars:
copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
tasks:
# update deps
- name: update apt
apt:
update_cache: true
# upgrade deps
- name: upgrade deps
apt:
upgrade: safe
update_cache: true
# install deps
- name: install deps
apt:
name:
- build-essential
- curl
- git
- vim
- libtool
- automake
- autoconf
- nasm
update_cache: true
# create devops group
- name: create devops group
group:
name: devops
state: present
- name: set devops group to have sudo access
lineinfile:
path: /etc/sudoers
state: present
regexp: ^%devops
line: '%devops ALL=(ALL) NOPASSWD: ALL'
validate: /usr/sbin/visudo -cf %s
# create devops user (with sudo)
- name: create a devops user with sudo privileges
user:
name: devops
state: present
groups: devops,www-data
append: true
create_home: true
shell: /bin/bash
- name: set authorized key for devops user
authorized_key:
user: devops
state: present
key: '{{ copy_local_key }}'
# create deploy user
- name: create a deploy user
user:
name: deploy
state: present
groups: www-data
append: true
create_home: true
shell: /bin/bash
generate_ssh_key: true
ssh_key_bits: 4096
- name: set authorized key for deploy user
authorized_key:
user: deploy
state: present
key: '{{ copy_local_key }}'
# TODO: change root password to randomly generated value
# configure ssh
- name: disable root login
lineinfile:
path: /etc/ssh/sshd_config
state: present
regexp: '^#?PermitRootLogin'
line: PermitRootLogin no
notify: restart ssh
- name: disable password authentication
lineinfile:
path: /etc/ssh/sshd_config
state: present
regexp: '^PasswordAuthentication'
line: 'PasswordAuthentication no'
notify: restart ssh
# TODO: we can probably remove the `./templates/security-limits.d-mongod.conf`
# modify ulimit for devops and deploy
# https://gist.github.com/visualskyrim/8d93a8be0a3ef6dd6598ec8550f6eadd#file-modify_ulimit-yml-L7
- name: configure system settings, file descriptors and number of threads
pam_limits:
domain: '*'
limit_type: "{{item.limit_type}}"
limit_item: "{{item.limit_item}}"
value: "{{item.value}}"
with_items:
- {limit_type: '-', limit_item: 'nofile', value: 65536}
- {limit_type: '-', limit_item: 'nproc', value: 65536}
- {limit_type: 'soft', limit_item: 'memlock', value: unlimited}
- {limit_type: 'hard', limit_item: 'memlock', value: unlimited}
- name: reload settings from all system configuration files
shell: sysctl --system
- hosts: "{{ hostlist }}"
become: true
become_user: root
vars:
#
# kernel tuning and performance optimizations
#
# https://medium.com/@k1d_bl4ck/a-quick-story-about-node-js-socket-io-and-the-linux-tcp-stack-bf1e8318b20e
# https://gist.github.com/vongosling/9929680
# https://wiki.mikejung.biz/Sysctl_tweaks
# https://docs.continuent.com/tungsten-clustering-6.1/performance-networking.html
# https://www.vpndada.com/how-to-setup-a-shadowsocks-server-on-digitalocean/
#
# TODO: we should research more configuration settings from these links:
# https://udgwebdev.github.io/tunning-em-servidor-linux/
# https://gist.github.com/voluntas/bc54c60aaa7ad6856e6f6a928b79ab6c
# https://serverdiary.com/linux/how-to-mitigate-tcp-syn-flood-attack-and-resolve-it-on-linux/
#
sysctl_settings:
#
# handle ufw forwarding
#
- name: net.ipv4.ip_forward
value: 1
- name: net.ipv6.conf.default.forwarding
value: 1
- name: net.ipv6.conf.all.forwarding
value: 1
# sets the time before the kernel considers
# migrating a process to another core
- name: kernel.sched_migration_cost_ns
value: 5000000
# handle swapping idle processes to disk
# https://medium.com/@sauravomar01/linux-kernel-tuning-and-performance-tweaks-d7848178aaa2
- name: vm.swappiness
value: 10
- name: vm.dirty_ratio
value: 60
- name: vm.dirty_background_ratio
value: 2
- name: vm.vfs_cache_pressure
value: 50
# allow local port range
- name: net.ipv4.ip_local_port_range
value: 1024 65535
# increase amount of option memory buffers
- name: net.core.optmem_max
value: 25165824
# max number of concurrently open files
- name: fs.file-max
value: 2097152
# increase the max number of "backlogged sockets" (default: 128)
# (max number of connections that can be queued for acceptance)
- name: net.core.somaxconn
value: 1024
# length of time orphaned (unreferenced) connection will wait (default: 60)
- name: net.ipv4.tcp_fin_timeout
value: 30
#
# allow more aggressive network throughput
# https://en.wikipedia.org/wiki/TCP_window_scale_option
#
- name: net.ipv4.tcp_window_scaling
value: 1
#
# configure tcp keepalive
# https://webhostinggeeks.com/howto/configure-linux-tcp-keepalive-setting/
#
- name: net.ipv4.tcp_keepalive_time
value: 60
- name: net.ipv4.tcp_keepalive_intvl
value: 10
#
# NOTE: it seems like this was removed in newer kernels
# `sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle: No such file or directory`
#
# - name: net.ipv4.tcp_keepalive_probe
# - value: 6
# max remembered connection requests which did not yet receive ACK (default: 1024)
# (how many half-open connections can be kept in the queue)
- name: net.ipv4.tcp_max_syn_backlog
value: 4096
# increase system ip port limts to allow for more connections
- name: net.ipv4.ip_local_port_range
value: 1024 65535
# number of packets queued on INPUT (default: 1000)
- name: net.core.netdev_max_backlog
value: 4096
#
# enable BBR congestion control and make HTTP/2 work reliably
# https://blog.cloudflare.com/http-2-prioritization-with-nginx/#comment-4147796381
#
- name: net.core.default_qdisc
value: fq
- name: net.ipv4.tcp_congestion_control
value: bbr
- name: net.ipv4.tcp_notsent_lowat
value: 16384
# protect against tcp time-wait
- name: net.ipv4.tcp_rfc1337
value: 1
#
# number of sockets in the "time-wait" state allowed to exist (prevents simple DOS attacks)
# https://easyengine.io/tutorials/linux/sysctl-conf/
# https://docs.continuent.com/tungsten-clustering-5.4/performance-networking.html
#
- name: net.ipv4.tcp_max_tw_buckets
value: 1440000
#
# we do not use this because it does not work well with load balancers
# and it also was removed from linux in v4.12
# https://stackoverflow.com/questions/6426253/tcp-tw-reuse-vs-tcp-tw-recycle-which-to-use-or-both
#
# NOTE: this was removed/deprecated in newer kernels
# `sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle: No such file or directory`
#
# - name: net.ipv4.tcp_tw_recycle
# value: 0
# allow to reuse TIME_WAIT sockets for new connections when safe from protocol
- name: net.ipv4.tcp_tw_reuse
value: 1
# increasing tcp receiving buffer memory size will help large file uploads
- name: net.ipv4.tcp_rmem
value: 4096 12582912 16777216
# increase tcp receiving memory to 16MB per socket
- name: net.core.rmem_max
value: 16777216
# increasing tcp send buffers will increase performance (if and only if) sending large files
- name: net.ipv4.tcp_wmem
value: 4096 12582912 16777216
# increase tcp receiving memory to 16MB per socket
- name: net.core.wmem_max
value: 16777216
# provide RFC 2861 behavior and time out congestion window after an idle period
# many suggest to disable it to improve performance in some cases
- name: net.ipv4.tcp_slow_start_after_idle
value: 0
# disable caching of TCP congestion state
- name: net.ipv4.tcp_no_metrics_save
value: 1
# set number of retries for for TCP 3 way handshake (default is 5)
# https://www.justsomestuff.co.uk/wiki/doku.php/linux/syn_tcp_timeout
- name: net.ipv4.tcp_syn_retries
value: 3
#
# number of times SYNACKS for passive TCP connection are tried
# https://blog.cloudflare.com/syn-packet-handling-in-the-wild/
#
- name: net.ipv4.tcp_synack_retries
value: 2
#
# TODO: node.js does not yet support tcp fastopen
#
# https://www.keycdn.com/support/tcp-fast-open
# https://github.com/nodejs/node/issues/8066
#
# - name: net.ipv4.tcp_fastopen
# value: 3
#
# tune ICMP black holes and adjust path MTU in a smart way
# https://blog.cloudflare.com/path-mtu-discovery-in-practice/
#
- name: net.ipv4.tcp_mtu_probing
value: 1
- name: net.ipv4.tcp_base_mss
value: 1024
#
# make the system resistant to out of memory scenarios
# https://www.linbit.com/kernel-min_free_kbytes/
#
# (e.g. 8GB ram = 128MB = 131072)
# (e.g. 4GB ram = 64MB = 65536)
#
- name: vm.min_free_kbytes
value: 65536
# control syncookies
- name: net.ipv4.tcp_syncookies
value: 1
# enable timestamps as defined in RFC1323
- name: net.ipv4.tcp_timestamps
value: 1
# tells the kernal how many TCP sockets not attached to any user file handle
# to maintain. if the number is exceeded, orphaned connections are reset and warning printed
- name: net.ipv4.tcp_max_orphans
value: 262144
roles:
# https://github.com/Oefenweb/ansible-sysctl
- role: sysctl
# https://github.com/Oefenweb/ansible-swapfile
- role: swapfile
swapfile_size: 4GB
swapfile_swappiness: '10'
swapfile_vfs_cache_pressure: '50'
# https://github.com/Oefenweb/ansible-dns
- role: dns
dns_nameservers:
# cloudflare
- '1.1.1.1'
- '1.0.0.1'
# https://github.com/Oefenweb/ansible-ntp
- role: ntp
ntp_servers:
- 'time.cloudflare.com'
# https://github.com/Oefenweb/ansible-timezone
- role: timezone
timezone_zone: 'America/Chicago'
# https://github.com/Oefenweb/ansible-fail2ban
- role: fail2ban
# https://github.com/jnv/ansible-role-unattended-upgrades
- role: unattended-upgrades
# https://github.com/fubarhouse/ansible-role-rust
# https://github.com/fubarhouse/ansible-role-rust/issues/20
# - role: rust
# TODO: set up logrotate for all roles/deps
# https://github.com/Oefenweb/ansible-logrotated
- hosts: http:bree
become: true
become_user: root
roles:
- mongo-shell