[init]
This commit is contained in:
commit
32f158b57b
71
README.md
Normal file
71
README.md
Normal file
@ -0,0 +1,71 @@
|
||||
# Wekan BASH Installer
|
||||
|
||||
## Why using this script?
|
||||
|
||||
If like me, you want to run Wekan on Debian and the [install options](https://github.com/wekan/wekan/wiki/Platforms) don't fit your model.
|
||||
|
||||
**Debian 9 Stretch images required for this script to work**
|
||||
|
||||
It won't work on Debian 10 Buster, little story about that below if you're interested.
|
||||
|
||||
## Crash course
|
||||
|
||||
|
||||
`curl https://git.interhacker.space/alban/wekan-bash-installer/raw/branch/master/install.sh | bash`
|
||||
|
||||
Pretty simple if you're into `curl|bash` methods ;) Otherwise feel free to `git clone`, `wget`, or use the method of your liking to download and execute.
|
||||
|
||||
|
||||
## How it works
|
||||
|
||||
**The script will install the following assets**
|
||||
|
||||
* Wekan
|
||||
* NodeJS
|
||||
* MongoDB
|
||||
* Nginx
|
||||
* Letsencrypt
|
||||
* Supervisor
|
||||
* Postfix
|
||||
* Wekan auto updater
|
||||
|
||||
**Notes**
|
||||
|
||||
* Wekan runs on localhost port 8080
|
||||
* Nginx acts as a reverse proxy for Wekan
|
||||
* Letsencrypt is used to provide HTTPS
|
||||
* Supervisor provides the daemonization of the process
|
||||
* Postfix runs on localhost to send emails, if not configured previously
|
||||
* The Wekan auto updater cron will check new bundles, install them, and reload the service
|
||||
* You can configure in the script the NodeJS version of your choice
|
||||
* NodeJS is installed from the NodeSource repository
|
||||
|
||||
|
||||
|
||||
## Words of Caution
|
||||
|
||||
### HTTPS and $DOMAIN
|
||||
|
||||
If you want an HTTPS vhost, better add your domain to the DNS.
|
||||
|
||||
Or Letsencrypt won't be able to verify your domain and you will get no certificate.
|
||||
|
||||
#### Backups
|
||||
|
||||
There's no mongodb backup automatically configured. Please don't run this in production without a data backup plan.
|
||||
|
||||
## Bugs, contribution
|
||||
|
||||
All are welcome.
|
||||
|
||||
Please send an email to wekan@albancrommer.com in case of an emergency.
|
||||
|
||||
## Why Debian 9 only?
|
||||
|
||||
Ah, well, you're reading, hey? Here's our little story.
|
||||
|
||||
Some day, mongodb decided it should change its licensing, and since it was restricting the freedom of its users Debian to remove mongodb packages from its new repositories.
|
||||
|
||||
Installing mongodb on Debian 10 «Buster» is a mess, and it doesn't look like mongodb has made any move to fix it.
|
||||
|
||||
So meanwhile, you're better off running
|
284
install.sh
Normal file
284
install.sh
Normal file
@ -0,0 +1,284 @@
|
||||
#! /bin/bash
|
||||
# @author alban
|
||||
# @since 2019-09-06
|
||||
# @license GPLv3
|
||||
# @url https://git.interhacker.space/alban/wekan-bash-installer
|
||||
|
||||
# Which
|
||||
MSG="Please provide the domain name you want to host wekan on [Default:localhost] : "
|
||||
read -p "$MSG" DOMAIN
|
||||
DOMAIN=${DOMAIN:-localhost}
|
||||
|
||||
MSG="Please provide the email address for wekan service mails [Default:wekan@${DOMAIN}] : "
|
||||
read -p "$MSG" EMAIL
|
||||
DEFAULT_EMAIL="wekan@$DOMAIN"
|
||||
EMAIL=${EMAIL:-$DEFAULT_EMAIL}
|
||||
|
||||
[ "$DOMAIN" != "localhost" ] && {
|
||||
MSG="Do you want to deploy an HTTPS vhost for wekan? [Y/n]"
|
||||
read -p "$MSG"
|
||||
REPLY=${REPLY:-Y}
|
||||
SSL=$( [ "${REPLY^^}" == "Y" ] && echo "yes" || echo "no" )
|
||||
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# You MIGHT change the following variables depending on your situation
|
||||
################################################################################
|
||||
|
||||
# Which nodejs do you wish to install
|
||||
NODEREPO="node_12.x"
|
||||
|
||||
|
||||
################################################################################
|
||||
# After that, you should not need to edit anything below.
|
||||
# But hack at leisure ;)
|
||||
################################################################################
|
||||
|
||||
# This script will only work on Debian 9 "Stretch"
|
||||
DISTRO="stretch"
|
||||
|
||||
# Helper functions
|
||||
ops=0
|
||||
Lets(){ let $(( ops++ )); echo -e "\n# ${ops}: $@\n"; }
|
||||
Red(){ echo -e "\033[0;31m$@\033[0m"; }
|
||||
|
||||
# Now comments will be noted by "^Lets" lines, see next line as an example
|
||||
Lets install required packages for basic APT operations
|
||||
apt update
|
||||
apt install -y apt-transport-https curl gnupg
|
||||
|
||||
Lets install the nodejs repository
|
||||
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -
|
||||
echo "deb https://deb.nodesource.com/${NODEREPO} ${DISTRO} main" > /etc/apt/sources.list.d/$NODEREPO.list
|
||||
|
||||
Lets install application packages and set the services auto up
|
||||
apt update
|
||||
apt install -y nodejs mongodb mongodb-server git nginx npm supervisor certbot make g++ unzip
|
||||
for f in mongodb nginx supervisor ; do systemctl enable $f; done
|
||||
|
||||
dpkg -l postfix | grep -q -E "^.i +postfix" || {
|
||||
|
||||
Lets install and configure the email service
|
||||
Red Caution! Please choose the \"Internet Site\" option when requested!
|
||||
apt install -y postfix
|
||||
|
||||
Lets configure Postfix to run on local loopback only
|
||||
postconf -e 'inet_interfaces = 127.0.0.1'
|
||||
service postfix restart
|
||||
|
||||
}
|
||||
|
||||
if [ $SSL == "yes" ] ; then
|
||||
|
||||
Lets create the nginx HTTP virtual host
|
||||
cat << HEREDOC > /etc/nginx/sites-available/wekan.conf
|
||||
# nginx configuration for wekan proxying
|
||||
|
||||
# this section is needed to proxy web-socket connections
|
||||
map \$http_upgrade \$connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
server {
|
||||
listen 80;
|
||||
server_name $DOMAIN;
|
||||
large_client_header_buffers 8 64k;
|
||||
client_header_buffer_size 64k;
|
||||
location .well-known/acme-challenge {
|
||||
root /var/www/letsencrypt;
|
||||
}
|
||||
location / {
|
||||
return 301 https://\$host\$request_uri;
|
||||
}
|
||||
}
|
||||
HEREDOC
|
||||
[ -L /etc/nginx/sites-enabled/wekan.conf ] || ln -s ../sites-available/wekan.conf /etc/nginx/sites-enabled/wekan.conf
|
||||
|
||||
Lets reload nginx
|
||||
nginx -t && service nginx reload
|
||||
|
||||
Lets request the certificate from Letsencrypt
|
||||
mkdir -p /var/www/letsencrypt/.well-known/acme-challenge
|
||||
echo "test $(hostname) OK" > /var/www/letsencrypt/.well-known/acme-challenge/test.txt
|
||||
chown -R www-data:www-data /var/www/letsencrypt
|
||||
curl http://$DOMAIN/.well-known/acme-challenge/test.txt && \
|
||||
certbot certonly --webroot --agree-tos -w /var/www/letsencrypt/ --email certs@$DOMAIN -d $DOMAIN
|
||||
|
||||
Lets create the HTTPS virtual host
|
||||
cat << HEREDOC >> /etc/nginx/sites-available/wekan.conf
|
||||
server {
|
||||
listen 443 http2;
|
||||
server_name $DOMAIN;
|
||||
large_client_header_buffers 8 64k;
|
||||
client_header_buffer_size 64k;
|
||||
ssl on;
|
||||
ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;
|
||||
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
|
||||
|
||||
# If your application is not compatible with IE <= 10, this will redirect visitors to a page advising a browser update
|
||||
# This works because IE 11 does not present itself as MSIE anymore
|
||||
if (\$http_user_agent ~ "MSIE" ) {
|
||||
return 303 https://browser-update.org/update.html;
|
||||
}
|
||||
|
||||
# Pass requests to Wekan.
|
||||
# If you have Wekan at https://example.com/wekan , change location to:
|
||||
# location /wekan {
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade \$http_upgrade; # allow websockets
|
||||
proxy_set_header Connection \$connection_upgrade;
|
||||
proxy_set_header X-Forwarded-For \$remote_addr; # preserve client IP
|
||||
|
||||
# this setting allows the browser to cache the application in a way compatible with Meteor
|
||||
# on every applicaiton update the name of CSS and JS file is different, so they can be cache infinitely (here: 30 days)
|
||||
# the root path (/) MUST NOT be cached
|
||||
if (\$uri != '/wekan') {
|
||||
expires 30d;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
HEREDOC
|
||||
|
||||
Lets reload nginx to handle HTTPS
|
||||
nginx -t && service nginx restart
|
||||
else
|
||||
|
||||
Lets create the nginx HTTP virtual host
|
||||
cat << HEREDOC > /etc/nginx/sites-available/wekan.conf
|
||||
# nginx configuration for wekan proxying
|
||||
|
||||
# this section is needed to proxy web-socket connections
|
||||
map \$http_upgrade \$connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
server {
|
||||
listen 80;
|
||||
server_name $DOMAIN;
|
||||
large_client_header_buffers 8 64k;
|
||||
client_header_buffer_size 64k;
|
||||
location .well-known/acme-challenge {
|
||||
root /var/www/letsencrypt;
|
||||
}
|
||||
|
||||
# If your application is not compatible with IE <= 10, this will redirect visitors to a page advising a browser update
|
||||
# This works because IE 11 does not present itself as MSIE anymore
|
||||
if (\$http_user_agent ~ "MSIE" ) {
|
||||
return 303 https://browser-update.org/update.html;
|
||||
}
|
||||
|
||||
# Pass requests to Wekan.
|
||||
# If you have Wekan at https://example.com/wekan , change location to:
|
||||
# location /wekan {
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade \$http_upgrade; # allow websockets
|
||||
proxy_set_header Connection \$connection_upgrade;
|
||||
proxy_set_header X-Forwarded-For \$remote_addr; # preserve client IP
|
||||
|
||||
# this setting allows the browser to cache the application in a way compatible with Meteor
|
||||
# on every applicaiton update the name of CSS and JS file is different, so they can be cache infinitely (here: 30 days)
|
||||
# the root path (/) MUST NOT be cached
|
||||
if (\$uri != '/wekan') {
|
||||
expires 30d;
|
||||
}
|
||||
}
|
||||
}
|
||||
HEREDOC
|
||||
|
||||
fi
|
||||
|
||||
Lets create the supervisor configuration
|
||||
mkdir /var/log/wekan
|
||||
ROOT_URL=$( [ $SSL == "yes" ] && echo "https://$DOMAIN" || echo "http://$DOMAIN")
|
||||
|
||||
cat << HEREDOC > /etc/supervisor/conf.d/wekan.conf
|
||||
[program:wekan]
|
||||
command=/usr/bin/node main.js
|
||||
process_name=%(program_name)s
|
||||
numprocs=1
|
||||
directory=/home/wekan/bundle
|
||||
umask=022
|
||||
priority=999
|
||||
autostart=true
|
||||
startsecs=1
|
||||
startretries=3
|
||||
autorestart=unexpected
|
||||
exitcodes=0,2
|
||||
stopsignal=QUIT
|
||||
stopwaitsecs=10
|
||||
stopasgroup=false
|
||||
killasgroup=false
|
||||
user=wekan
|
||||
redirect_stderr=false
|
||||
stdout_logfile=/var/log/wekan/out.log
|
||||
stdout_logfile_maxbytes=1MB
|
||||
stdout_logfile_backups=10
|
||||
stdout_capture_maxbytes=1MB
|
||||
stdout_events_enabled=false
|
||||
stderr_logfile=/var/log/wekan/err.log
|
||||
stderr_logfile_maxbytes=1MB
|
||||
stderr_logfile_backups=10
|
||||
stderr_capture_maxbytes=1MB
|
||||
stderr_events_enabled=false
|
||||
environment=MONGO_URL='mongodb://127.0.0.1:27017/wekan',ROOT_URL='$ROOT_URL',MAIL_URL='smtp://localhost:25/',MAIL_FROM='$EMAIL',PORT=8080,BIND_IP=127.0.0.1,HTTP_FORWARDED_COUNT=1
|
||||
serverurl=AUTO
|
||||
HEREDOC
|
||||
|
||||
Lets create the auto upgrade script
|
||||
cat << HEREDOC > /usr/local/sbin/auto_upgrade_wekan
|
||||
#! /bin/bash
|
||||
exec & >> /var/log/auto_upgrade_wekan.log
|
||||
URL="https://releases.wekan.team/"
|
||||
NEW=\$(curl -s \$URL | grep -e ">wekan.*zip"|sed -r "s/^.*>wekan-(.*?).zip<.*\$/\1/"| sort | tail -n 1)
|
||||
CUR=\$(readlink /home/wekan/bundle| cut -d"/" -f 4)
|
||||
[ "\$NEW" == "\$CUR" ] && exit 0
|
||||
[ -e /home/wekan/\$NEW ] && exit 0
|
||||
echo "$(date) Install $NEW"
|
||||
TMP=\$( mktemp -d )
|
||||
cd "\$TMP"
|
||||
wget --quiet "\$URL/wekan-\$NEW.zip"
|
||||
unzip "wekan-\$NEW.zip" &>/dev/null
|
||||
mv bundle "/home/wekan/\$NEW"
|
||||
cd "/home/wekan/\$NEW/programs/server"
|
||||
npm uninstall fibers
|
||||
npm install fibers
|
||||
chown -R wekan:wekan "/home/wekan/\$NEW"
|
||||
rm -rf "\$TMP"
|
||||
rm -f "/home/wekan/bundle"
|
||||
ln -s "/home/wekan/\$NEW" "/home/wekan/bundle"
|
||||
supervisorctl restart wekan
|
||||
echo "$(date) Restarted"
|
||||
HEREDOC
|
||||
chmod +x /usr/local/sbin/auto_upgrade_wekan
|
||||
cat << HEREDOC > /etc/cron.d/auto_upgrade_wekan
|
||||
0 0 * * * root /usr/local/sbin/auto_upgrade_wekan
|
||||
HEREDOC
|
||||
|
||||
Lets add a wekan user
|
||||
adduser --disabled-password --gecos "" wekan
|
||||
|
||||
Lets download the latest bundle
|
||||
URL="https://releases.wekan.team/"
|
||||
NEW=$(curl -s $URL | grep -e ">wekan.*zip"|sed -r "s/^.*>wekan-(.*?).zip<.*$/\1/"| sort | tail -n 1)
|
||||
TMP=$( mktemp -d )
|
||||
cd "$TMP"
|
||||
wget --quiet "$URL/wekan-$NEW.zip"
|
||||
unzip "wekan-$NEW.zip" &>/dev/null
|
||||
mv bundle "/home/wekan/$NEW"
|
||||
cd "/home/wekan/$NEW/programs/server"
|
||||
npm uninstall fibers
|
||||
npm install fibers
|
||||
chown -R wekan:wekan "/home/wekan/$NEW"
|
||||
rm -rf "$TMP"
|
||||
ln -s "/home/wekan/$NEW" "/home/wekan/bundle"
|
||||
|
||||
Lets reload supervisor
|
||||
supervisorctl reread
|
||||
supervisorctl update
|
Loading…
Reference in New Issue
Block a user