diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 88477c4..2c995d9 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -19,10 +19,10 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-20.04, ubuntu-18.04]
+ os: [ubuntu-20.04, ubuntu-18.04, ubuntu-22.04]
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Prepare VM
run: |
unset LANG
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 09994fb..7acba3e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,27 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
### v3.16.0 - [Unreleased]
+### v3.15.3 - 2022-10-24
+
+#### Added
+
+- Support for Debian 10/11
+
+#### Changed
+
+- Install redis from official repository
+- Redis version bump to 7.0.5
+- WP-CLI version bump to 2.7.1
+- Remove outdated Nginx directives
+- Updated repository GPG Key
+- UFW stack detect proftpd during install
+
+#### Fixed
+
+- Netdata upgrade failure on old servers
+- MariaDB service disabled after upgrade with `wo stack migrate --mariadb`
+- Proftpd install on Ubuntu 22.04 and Debian 11
+
### v3.15.2 - 2022-09-23
#### Added
diff --git a/README.md b/README.md
index b73b436..a837665 100644
--- a/README.md
+++ b/README.md
@@ -41,8 +41,8 @@
- **Easy to install** : One step automated installer with migration from EasyEngine v3 support
- **Fast deployment** : Fast and automated WordPress, Nginx, PHP, MySQL & Redis installation
-- **Custom Nginx build** : Nginx 1.22.0 - TLS v1.3 Cloudflare HTTP/2 HPACK & Brotli support
-- **Up-to-date** : PHP 7.2, 7.3, 7.4, 8.0 & 8.1 - MariaDB 10.6 & Redis 6.0
+- **Custom Nginx build** : Nginx 1.22.1 - TLS v1.3 Cloudflare HTTP/2 HPACK & Brotli support
+- **Up-to-date** : PHP 7.2, 7.3, 7.4, 8.0 & 8.1 - MariaDB 10.6 & Redis 7.0
- **Secured** : Hardened WordPress security with strict Nginx location directives
- **Powerful** : Optimized Nginx configurations with multiple cache backends support
- **SSL** : Domain, Subdomain & Wildcard Let's Encrypt SSL certificates with DNS API support
@@ -66,11 +66,11 @@
#### Also compatible
- Debian 10 (Buster)
-- Raspbian 10 (Buster)
+- Debian 11 (Bullseye)
#### For testing purpose only
-- Debian 11 (Bullseye)
+- Raspbian 10 (Buster)
- Raspbian 11 (Bullseye)
## Getting Started
@@ -87,14 +87,13 @@ Detailed Getting Started guide with additional installation methods can be found
### Standard WordPress sites
```bash
-wo site create example.com --wp # install wordpress with PHP 7.3 without any page caching
-wo site create example.com --wp --php80 # install wordpress with PHP 8.0 without any page caching
-wo site create example.com --wp --php81 # install wordpress with PHP 8.1 without any page caching
-wo site create example.com --wpfc # install wordpress + nginx fastcgi_cache
-wo site create example.com --wpredis # install wordpress + nginx redis_cache
-wo site create example.com --wprocket # install wordpress with WP-Rocket plugin
-wo site create example.com --wpce # install wordpress with Cache-enabler plugin
-wo site create example.com --wpsc # install wordpress with wp-super-cache plugin
+wo site create example.com --wp # install wordpress with PHP 8.0 without any page caching
+wo site create example.com --wp --php81 # install wordpress with PHP 8.1 without any page caching
+wo site create example.com --wpfc # install wordpress + nginx fastcgi_cache
+wo site create example.com --wpredis # install wordpress + nginx redis_cache
+wo site create example.com --wprocket # install wordpress with WP-Rocket plugin
+wo site create example.com --wpce # install wordpress with Cache-enabler plugin
+wo site create example.com --wpsc # install wordpress with wp-super-cache plugin
```
### WordPress multisite with subdirectory
@@ -125,10 +124,9 @@ wo site create example.com --wpsubdomain --wpce # install wpmu-subdomain + C
wo site create example.com --html # create example.com for static/html sites
wo site create example.com --php # create example.com with php 8.0 support
wo site create example.com --php80 # create example.com with php 8.0 support
-wo site create example.com --php74 # create example.com with php 7.4 support
+wo site create example.com --php81 # create example.com with php 8.1 support
wo site create example.com --mysql # create example.com with php 8.0 & mysql support
wo site create example.com --mysql --php81 # create example.com with php 8.1 & mysql support
-wo site create example.com --mysql --php73 # create example.com with php 7.3 & mysql support
wo site create example.com --proxy=127.0.0.1:3000 # create example.com with nginx as reverse-proxy
```
@@ -196,7 +194,7 @@ Third-party debian packages shipped with WordOps :
- [Nginx-wo by WordOps](https://build.opensuse.org/package/show/home:virtubox:WordOps/nginx)
- [PHP by Ondřej Surý](https://launchpad.net/~ondrej/+archive/ubuntu/php)
-- [Redis by Chris Lea](https://launchpad.net/~chris-lea/+archive/ubuntu/redis-server)
+- [Redis](https://redis.io/docs/getting-started/installation/install-redis-on-linux/)
WordPress Cache Plugins supported by WordOps :
diff --git a/install b/install
index 5f7ba7d..c19a950 100755
--- a/install
+++ b/install
@@ -9,7 +9,7 @@
# -------------------------------------------------------------------------
# wget -qO wo wops.cc && sudo -E bash wo
# -------------------------------------------------------------------------
-# Version 3.15.2 - 2022-09-23
+# Version 3.15.3 - 2022-10-24
# -------------------------------------------------------------------------
# CONTENTS
@@ -519,6 +519,8 @@ wo_travis_install() {
if [ "$wo_linux_distro" = "Debian" ] || [ "$wo_linux_distro" = "Raspbian" ]; then
if [ "$wo_distro_codename" = "stretch" ]; then
python3 -m pip install git+https://salsa.debian.org/apt-team/python-apt.git@1.4.y#egg=python-apt
+ elif [ "$wo_distro_codename" = "bullseye" ]; then
+ python3 -m pip install git+https://salsa.debian.org/apt-team/python-apt.git@2.2.1#egg=python-apt
else
python3 -m pip install git+https://salsa.debian.org/apt-team/python-apt.git@1.8.4.y#egg=python-apt
fi
@@ -527,8 +529,10 @@ wo_travis_install() {
python3 -m pip install git+https://salsa.debian.org/apt-team/python-apt.git@2.0.0#egg=python-apt
elif [ "$wo_distro_codename" = "bionic" ]; then
python3 -m pip install git+https://salsa.debian.org/apt-team/python-apt.git@1.6.y#egg=python-apt
+ elif [ "$wo_distro_codename" = "jammy" ]; then
+ python3 -m pip install git+https://salsa.debian.org/apt-team/python-apt.git@2.2.1#egg=python-apt
else
- python3 -m pip install git+https://salsa.debian.org/apt-team/python-apt.git@1.1.0_beta1ubuntu0.16.04.9#egg=python-apt
+ python3 -m pip install git+https://salsa.debian.org/apt-team/python-apt.git@1.1.y-xenial#egg=python-apt
fi
fi
fi
@@ -728,7 +732,7 @@ wo_woconf() {
echo -e '\n[letsencrypt]\n\nkeylength = "ec-384"' >>/etc/wo/wo.conf
fi
if ! grep -q "php" /etc/wo/wo.conf; then
- echo -e '\n[php]\n\nversion = 7.4' >>/etc/wo/wo.conf
+ echo -e '\n[php]\n\nversion = 8.0' >>/etc/wo/wo.conf
fi
fi
}
@@ -793,7 +797,7 @@ wo_php_fix() {
wo_git_secure_path() {
if ! grep -q "safe" ~/.gitconfig; then
- echo -e "\n[safe]\n directory = *" >> ~/.gitconfig
+ echo -e "\n[safe]\n directory = *" >>~/.gitconfig
fi
}
diff --git a/setup.py b/setup.py
index 9c87f06..c6195f9 100644
--- a/setup.py
+++ b/setup.py
@@ -27,7 +27,7 @@ if os.geteuid() == 0:
os.makedirs('/var/lib/wo/tmp/')
setup(name='wordops',
- version='3.15.2',
+ version='3.15.3',
description='An essential toolset that eases server administration',
long_description=LONG,
long_description_content_type='text/markdown',
diff --git a/wo/cli/plugins/stack_pref.py b/wo/cli/plugins/stack_pref.py
index 10b6f66..fcb236b 100644
--- a/wo/cli/plugins/stack_pref.py
+++ b/wo/cli/plugins/stack_pref.py
@@ -108,17 +108,12 @@ def pre_pref(self, apt_packages):
WORepo.add_key(self, WOVar.wo_php_key)
# add redis repository
if set(WOVar.wo_redis).issubset(set(apt_packages)):
- if WOVar.wo_distro == 'ubuntu':
+ if not WOFileUtils.grepcheck(
+ self, '/etc/apt/sources.list/wo-repo.list',
+ 'redis.io'):
Log.info(self, "Adding repository for Redis, please wait...")
- Log.debug(self, 'Adding ppa for redis')
- WORepo.add(self, ppa=WOVar.wo_redis_repo)
- else:
- if not WOFileUtils.grepcheck(
- self, '/etc/apt/sources.list/wo-repo.list',
- 'WordOps'):
- Log.info(self, "Adding repository for Redis, please wait...")
- WORepo.add(self, repo_url=WOVar.wo_nginx_repo)
- WORepo.add_key(self, WOVar.wo_nginx_key)
+ WORepo.add(self, repo_url=WOVar.wo_redis_repo)
+ WORepo.download_key(self, WOVar.wo_redis_key_url)
# nano
if 'nano' in apt_packages:
@@ -1401,18 +1396,10 @@ def post_pref(self, apt_packages, packages, upgrade=False):
msg="Adding ProFTPd into Git")
if os.path.isfile("/etc/proftpd/proftpd.conf"):
Log.debug(self, "Setting up Proftpd configuration")
- WOFileUtils.searchreplace(
- self, "/etc/proftpd/proftpd.conf",
- "# DefaultRoot", "DefaultRoot")
- WOFileUtils.searchreplace(
- self, "/etc/proftpd/proftpd.conf",
- "# RequireValidShell", "RequireValidShell")
- WOFileUtils.searchreplace(
- self, "/etc/proftpd/proftpd.conf",
- "# PassivePorts "
- "49152 65534",
- "PassivePorts "
- " 49000 50000")
+ data = dict()
+ WOTemplate.deploy(self,
+ '/etc/proftpd/proftpd.conf',
+ 'proftpd.mustache', data)
# proftpd TLS configuration
if not os.path.isdir("/etc/proftpd/ssl"):
WOFileUtils.mkdir(self, "/etc/proftpd/ssl")
@@ -1422,10 +1409,6 @@ def post_pref(self, apt_packages, packages, upgrade=False):
data = dict()
WOTemplate.deploy(self, '/etc/proftpd/tls.conf',
'proftpd-tls.mustache', data)
- WOFileUtils.searchreplace(self, "/etc/proftpd/"
- "proftpd.conf",
- "#Include /etc/proftpd/tls.conf",
- "Include /etc/proftpd/tls.conf")
WOService.restart_service(self, 'proftpd')
if os.path.isfile('/etc/ufw/ufw.conf'):
diff --git a/wo/cli/plugins/stack_upgrade.py b/wo/cli/plugins/stack_upgrade.py
index 53a1b94..b0333b2 100644
--- a/wo/cli/plugins/stack_upgrade.py
+++ b/wo/cli/plugins/stack_upgrade.py
@@ -383,6 +383,15 @@ class WOStackUpgradeController(CementBaseController):
"bash /var/lib/wo/tmp/kickstart.sh "
"--dont-wait --no-updates --stable-channel",
errormsg='', log=False)
+ if (os.path.exists('/opt/netdata') and
+ not os.path.exists(
+ '/opt/netdata/var/run/netdata/netdata.pid')):
+ WOShellExec.cmd_exec(
+ self,
+ 'bash /var/lib/wo/tmp/kickstart.sh '
+ '--dont-wait --no-updates '
+ '--stable-channel --reinstall-even-if-unsafe',
+ errormsg='', log=False)
Log.valide(self, "Upgrading Netdata")
if WOAptGet.is_selected(self, 'WordOps Dashboard', packages):
diff --git a/wo/cli/templates/locations.mustache b/wo/cli/templates/locations.mustache
index 2edaaba..5c2deba 100644
--- a/wo/cli/templates/locations.mustache
+++ b/wo/cli/templates/locations.mustache
@@ -41,7 +41,7 @@ location /.well-known/acme-challenge/ {
# https://developer.chrome.com/blog/private-prefetch-proxy/
location /.well-known/traffic-advice {
types { } default_type "application/trafficadvice+json; charset=utf-8";
- alias /var/www/html/.well-known/traffic-advice;
+ return 200 "[\{\n \"user_agent\": \"prefetch-proxy\",\n \"google_prefetch_proxy_eap\": \{\n \"fraction\": 1.0\n \}\n\}]";
allow all;
}
# Return 403 forbidden for readme.(txt|html) or license.(txt|html) or example.(txt|html) or other common git repository files
diff --git a/wo/cli/templates/proftpd-tls.mustache b/wo/cli/templates/proftpd-tls.mustache
index e4290e0..dd31eaf 100644
--- a/wo/cli/templates/proftpd-tls.mustache
+++ b/wo/cli/templates/proftpd-tls.mustache
@@ -4,11 +4,13 @@ TLSEngine on
TLSRequired on
TLSLog /var/log/proftpd/tls.log
+TLSDHParamFile /etc/proftpd/dhparams.pem
+
# intermediate configuration from ssl-config.mozilla.org
TLSProtocol TLSv1.2
TLSCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
TLSServerCipherPreference off
-TLSessionTickets off
+TLSSessionTickets off
TLSOptions NoCertRequest AllowClientRenegotiations NoSessionReuseRequired
TLSRSACertificateFile /etc/proftpd/ssl/proftpd.crt
diff --git a/wo/cli/templates/proftpd.mustache b/wo/cli/templates/proftpd.mustache
new file mode 100644
index 0000000..d708a69
--- /dev/null
+++ b/wo/cli/templates/proftpd.mustache
@@ -0,0 +1,138 @@
+#
+# /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file.
+# To really apply changes, reload proftpd after modifications, if
+# it runs in daemon mode. It is not required in inetd/xinetd mode.
+#
+
+# Includes DSO modules
+Include /etc/proftpd/modules.conf
+
+# Set off to disable IPv6 support which is annoying on IPv4 only boxes.
+UseIPv6 off
+# If set on you can experience a longer connection delay in many cases.
+
+IdentLookups off
+
+ServerName "Debian"
+# Set to inetd only if you would run proftpd by inetd/xinetd.
+# Read README.Debian for more information on proper configuration.
+ServerType standalone
+DeferWelcome off
+
+MultilineRFC2228 on
+DefaultServer on
+ShowSymlinks on
+
+TimeoutNoTransfer 600
+TimeoutStalled 600
+TimeoutIdle 1200
+
+DisplayLogin welcome.msg
+DisplayChdir .message true
+ListOptions "-l"
+
+DenyFilter \*.*/
+
+# Use this to jail all users in their homes
+DefaultRoot ~
+
+# Users require a valid shell listed in /etc/shells to login.
+# Use this directive to release that constrain.
+RequireValidShell off
+
+# Port 21 is the standard FTP port.
+Port 21
+
+# In some cases you have to specify passive ports range to by-pass
+# firewall limitations. Ephemeral ports can be used for that, but
+# feel free to use a more narrow range.
+PassivePorts 49000 50000
+
+# If your host was NATted, this option is useful in order to
+# allow passive tranfers to work. You have to use your public
+# address and opening the passive ports used on your firewall as well.
+# MasqueradeAddress 1.2.3.4
+
+# This is useful for masquerading address with dynamic IPs:
+# refresh any configured MasqueradeAddress directives every 8 hours
+
+# DynMasqRefresh 28800
+
+
+# To prevent DoS attacks, set the maximum number of child processes
+# to 30. If you need to allow more than 30 concurrent connections
+# at once, simply increase this value. Note that this ONLY works
+# in standalone mode, in inetd mode you should use an inetd server
+# that allows you to limit maximum number of processes per service
+# (such as xinetd)
+MaxInstances 30
+
+# Set the user and group that the server normally runs at.
+User proftpd
+Group nogroup
+
+# Umask 022 is a good standard umask to prevent new files and dirs
+# (second parm) from being group and world writable.
+Umask 022 022
+# Normally, we want files to be overwriteable.
+AllowOverwrite on
+
+# Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords:
+# PersistentPasswd off
+
+# This is required to use both PAM-based authentication and local passwords
+# AuthOrder mod_auth_pam.c* mod_auth_unix.c
+
+# Be warned: use of this directive impacts CPU average load!
+# Uncomment this if you like to see progress and transfer rate with ftpwho
+# in downloads. That is not needed for uploads rates.
+#
+UseSendFile off
+
+TransferLog /var/log/proftpd/xferlog
+SystemLog /var/log/proftpd/proftpd.log
+
+# Logging onto /var/log/lastlog is enabled but set to off by default
+#UseLastlog on
+
+# In order to keep log file dates consistent after chroot, use timezone info
+# from /etc/localtime. If this is not set, and proftpd is configured to
+# chroot (e.g. DefaultRoot or ), it will use the non-daylight
+# savings timezone regardless of whether DST is in effect.
+SetEnv TZ :/etc/localtime
+
+
+QuotaEngine off
+
+
+
+Ratios off
+
+
+
+# Delay engine reduces impact of the so-called Timing Attack described in
+# http://www.securityfocus.com/bid/11430/discuss
+# It is on by default.
+
+DelayEngine on
+
+
+
+ControlsEngine off
+ControlsMaxClients 2
+ControlsLog /var/log/proftpd/controls.log
+ControlsInterval 5
+ControlsSocket /var/run/proftpd/proftpd.sock
+
+
+
+AdminControlsEngine off
+
+
+
+# This is used for FTPS connections
+#
+Include /etc/proftpd/tls.conf
+
+# Include other custom configuration files
+Include /etc/proftpd/conf.d/
diff --git a/wo/cli/templates/ufw.mustache b/wo/cli/templates/ufw.mustache
index f64fc39..bc4b684 100644
--- a/wo/cli/templates/ufw.mustache
+++ b/wo/cli/templates/ufw.mustache
@@ -46,6 +46,13 @@ wo_ufw_setup() {
# wordops backend
ufw limit 22222
fi
+
+ # allow proftpd port if installed
+ if [ -f /etc/proftpd/proftpd.conf ]; then
+ ufw limit 21
+ ufw allow 49000:50000/tcp
+ fi
+
# enable ufw
if [ -n "$CURRENT_SSH_PORT" ]; then
ufw --force enable
diff --git a/wo/core/variables.py b/wo/core/variables.py
index 808395e..596a173 100644
--- a/wo/core/variables.py
+++ b/wo/core/variables.py
@@ -15,9 +15,9 @@ class WOVar():
"""Intialization of core variables"""
# WordOps version
- wo_version = "3.15.2"
+ wo_version = "3.15.3"
# WordOps packages versions
- wo_wp_cli = "2.6.0"
+ wo_wp_cli = "2.7.1"
wo_adminer = "4.8.1"
wo_phpmyadmin = "5.2.0"
wo_extplorer = "2.1.13"
@@ -200,7 +200,6 @@ class WOVar():
codename=wo_platform_codename))
if wo_distro == 'ubuntu':
wo_php_repo = "ppa:ondrej/php"
- wo_redis_repo = ("ppa:redislabs/redis")
wo_goaccess_repo = ("ppa:alex-p/goaccess")
else:
@@ -208,8 +207,9 @@ class WOVar():
"deb https://packages.sury.org/php/ {codename} main"
.format(codename=wo_platform_codename))
wo_php_key = 'AC0E47584A7A714D'
- wo_redis_repo = ("deb https://packages.sury.org/php/ {codename} all"
- .format(codename=wo_platform_codename))
+ wo_redis_key_url = "https://packages.redis.io/gpg"
+ wo_redis_repo = ("deb https://packages.redis.io/deb {codename} main"
+ .format(codename=wo_platform_codename))
wo_redis = ['redis-server']