Makefile 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. SHELL := /bin/bash
  2. .PHONY: depend
  3. depend:
  4. [ -f "/etc/debian_version" ] && make prereq-debs; /bin/true;
  5. make prereq-perl prereq-frontend
  6. .PHONY: install
  7. install:
  8. test -d www/themes || mkdir -p www/themes
  9. test -d data/files || mkdir -p data/files
  10. test -d www/assets || mkdir -p www/assets
  11. test -d www/statics || mkdir -p www/statics
  12. test -d totp/ || mkdir -p totp
  13. test -d ~/.tcms || mkdir ~/.tcms
  14. test -d /var/log && mkdir /var/log/www; /bin/true
  15. $(RM) pod2htmd.tmp;
  16. .PHONY: install-service
  17. install-service:
  18. mkdir -p ~/.config/systemd/user
  19. cp service-files/systemd.unit ~/.config/systemd/user/tCMS.service
  20. sed -ie 's#__REPLACEME__#$(shell pwd)#g' ~/.config/systemd/user/tCMS.service
  21. sed -ie 's#__PORT__#$(PORT)#g' ~/.config/systemd/user/tCMS.service
  22. systemctl --user daemon-reload
  23. systemctl --user enable tCMS
  24. systemctl --user start tCMS
  25. loginctl enable-linger $(USER)
  26. .PHONY: prereq-debian
  27. prereq-debian: prereq-debs prereq-perl prereq-frontend prereq-node
  28. .PHONY: prereq-debs
  29. prereq-debs:
  30. sudo apt-get update
  31. sudo apt-get install -y sqlite3 nodejs npm libsqlite3-dev libdbd-sqlite3-perl cpanminus starman libxml2 curl \
  32. uwsgi uwsgi-plugin-psgi fail2ban nginx certbot postfix dovecot-imapd dovecot-pop3d postgrey spamassassin amavis clamav\
  33. libtext-xslate-perl libplack-perl libconfig-tiny-perl libdatetime-format-http-perl libjson-maybexs-perl \
  34. libuuid-tiny-perl libcapture-tiny-perl libconfig-simple-perl libdbi-perl libfile-slurper-perl libfile-touch-perl \
  35. libfile-copy-recursive-perl libxml-rss-perl libmodule-install-perl libio-string-perl uuid-dev \
  36. libmoose-perl libmoosex-types-datetime-perl libxml-libxml-perl liblist-moreutils-perl libclone-perl libpath-tiny-perl
  37. .PHONY: prereq-perl
  38. prereq-perl:
  39. sudo cpanm -n --installdeps .
  40. .PHONY: prereq-node
  41. prereq-node:
  42. npm i
  43. .PHONY: prereq-frontend
  44. prereq-frontend:
  45. mkdir -p www/scripts; pushd www/scripts && curl -L --remote-name-all \
  46. "https://raw.githubusercontent.com/chalda-pnuzig/emojis.json/master/dist/list.min.json" \
  47. "https://raw.githubusercontent.com/highlightjs/cdn-release/main/build/highlight.min.js"; popd
  48. mkdir -p www/styles; cd www/styles && curl -L --remote-name-all \
  49. "https://raw.githubusercontent.com/highlightjs/cdn-release/main/build/styles/obsidian.min.css"
  50. .PHONY: reset
  51. reset: reset-remove install
  52. .PHONY: reset-remove
  53. reset-remove:
  54. rm -rf data; /bin/true
  55. rm -rf www/themes; /bin/true
  56. rm -rf www/assets; /bin/true
  57. rm config/auth.db; /bin/true
  58. rm config/main.cfg; /bin/true
  59. rm config/has_users; /bin/true
  60. rm config/setup; /bin/true
  61. .PHONY: fail2ban
  62. fail2ban:
  63. sudo ln -sr fail2ban/tcms-jail.conf /etc/fail2ban/jail.d/tcms.conf
  64. sudo ln -sr fail2ban/tcms-filter.conf /etc/fail2ban/filter.d/tcms.conf
  65. sudo systemctl reload fail2ban
  66. .PHONY: nginx
  67. nginx:
  68. [ -n "$$SERVER_NAME" ] || ( echo "Please set the SERVER_NAME environment variable before running (e.g. test.test)" && /bin/false )
  69. [ -n "$$SERVER_PORT" ] || ( echo "Please set the SERVER_PORT environment variable before running (e.g. 5000)" && /bin/false )
  70. sed 's/\%SERVER_NAME\%/$(SERVER_NAME)/g' nginx/tcms.conf.tmpl > nginx/tcms.conf.intermediate
  71. sed 's/\%SERVER_PORT\%/$(SERVER_PORT)/g' nginx/tcms.conf.intermediate > nginx/tcms.conf
  72. rm nginx/tcms.conf.intermediate
  73. sudo mkdir -p '/var/www/$(SERVER_NAME)'
  74. sudo mkdir -p '/var/www/mail.$(SERVER_NAME)'
  75. sudo mkdir -p '/etc/letsencrypt/live/$(SERVER_NAME)'
  76. [ -e "/etc/nginx/sites-enabled/$$SERVER_NAME.conf" ] && sudo rm "/etc/nginx/sites-enabled/$$SERVER_NAME.conf"
  77. sudo ln -sr nginx/tcms.conf '/etc/nginx/sites-enabled/$(SERVER_NAME).conf'
  78. # Make a self-signed cert FIRST, because certbot has a chicken/egg problem
  79. sudo openssl req -x509 -config etc/openssl.conf -nodes -newkey rsa:4096 -subj '/CN=$(SERVER_NAME)' -addext 'subjectAltName=DNS:www.$(SERVER_NAME),DNS:mail.$(SERVER_NAME)' -keyout '/etc/letsencrypt/live/$(SERVER_NAME)/privkey.pem' -out '/etc/letsencrypt/live/$(SERVER_NAME)/fullchain.pem' -days 365
  80. sudo systemctl reload nginx
  81. # Now run certbot and get that http dcv. We have to do a "gamer move" so that certbot doesn't complain about live dir existing.
  82. sudo rm -rf '/etc/letsencrypt/live/$(SERVER_NAME)'
  83. sudo certbot certonly --webroot -w '/var/www/$(SERVER_NAME)/' -d '$(SERVER_NAME)' -d 'www.$(SERVER_NAME)' -w '/var/www/mail.$(SERVER_NAME)' -d 'mail.$(SERVER_NAME)'
  84. sudo systemctl reload nginx
  85. .PHONY: mail
  86. mail: nginx
  87. # Dovecot
  88. sudo cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig
  89. sudo sed -i 's/^\(ssl_cert\s*=\).*/\1<\/etc\/letsencrypt\/live\/$(SERVER_NAME)\/fullchain.pem/g' /etc/dovecot/conf.d/10-ssl.conf
  90. sudo sed -i 's/^\(ssl_key\s*=\).*/\1\<\/etc\/letsencrypt\/live\/$(SERVER_NAME)\/privkey.pem/g' /etc/dovecot/conf.d/10-ssl.conf
  91. # Postfix
  92. sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
  93. sudo sed -i 's/^\(smtpd_tls_cert_file\s*=\).*/\1\/etc\/letsencrypt\/live\/$(SERVER_NAME)\/fullchain.pem/g' /etc/postfix/main.cf
  94. sudo sed -i 's/^\(smtpd_tls_key_file\s*=\).*/\1\/etc\/letsencrypt\/live\/$(SERVER_NAME)\/privkey.pem/g' /etc/postfix/main.cf
  95. sudo sed -i 's/^\(myhostname\s*=\).*/\1$(SERVER_NAME)/g' /etc/postfix/main.cf
  96. sudo echo '$(SERVER_NAME)' > /etc/mailname
  97. # TODO everything else
  98. .PHONY: all
  99. all: prereq-debian install fail2ban mail