Requires: systemd/systemd#30080
cd path/to/your/local/sources
# creates a container with the current directory mapped to /var/www/html and configures apache/php/mariadb.
create-webfedora.sh testsite| #!/bin/sh | |
| version=${2:-39} | |
| name=${1:-fw${version}} | |
| webroot=${3:-${PWD}} | |
| installroot=${4:-/var/lib/machines/${name}} | |
| dnf="dnf --installroot=${installroot} --setopt=cachedir=/var/cache/dnf --releasever=${version} --repo=fedora --repo=updates --setopt=install_weak_deps=False --setopt=keepcache=True" | |
| packages=( | |
| passwd | |
| fedora-release | |
| vim-minimal | |
| util-linux | |
| systemd | |
| httpd | |
| mod_ssl | |
| mariadb | |
| mariadb-server | |
| php-fpm | |
| php-cli | |
| php-common | |
| php-gd | |
| php-intl | |
| php-mbstring | |
| php-mysqlnd | |
| php-opcache | |
| php-pdo | |
| php-pecl-apcu | |
| php-pecl-zip | |
| php-process | |
| php-soap | |
| php-sodium | |
| php-xml | |
| ) | |
| if [ "$version" -le "31" ]; then | |
| echo "Fedora <= v31 is not supported" | |
| exit; | |
| fi | |
| if [ "$version" -ge "33" ]; then | |
| packages+=( "systemd-networkd" ) | |
| fi | |
| if [ "$version" -ge "35" ]; then | |
| packages+=( "systemd-resolved" ) | |
| fi | |
| sudo machinectl stop $name &>/dev/null && sleep 2 | |
| sudo $dnf -y install ${packages[*]} | |
| sudo mkdir -p /etc/systemd/nspawn | |
| echo -ne "[Exec]\nNotifyReady=on\n" | sudo tee /etc/systemd/nspawn/${name}.nspawn > /dev/null | |
| echo -ne "[Files]\nBind=${webroot}:/var/www/html:owneridmap\n" | sudo tee -a /etc/systemd/nspawn/${name}.nspawn > /dev/null | |
| tmpdir=$(mktemp -d "/tmp/${name}-keys.XXX") | |
| mkcert -key-file "$tmpdir/key.pem" -cert-file "$tmpdir/cert.pem" ${name} | |
| sudo chown root:root "$tmpdir/key.pem" "$tmpdir/cert.pem" | |
| sudo mv "$tmpdir/key.pem" "$installroot/etc/pki/tls/private/mkcert-key.pem" | |
| sudo mv "$tmpdir/cert.pem" "$installroot/etc/pki/tls/certs/mkcert-cert.pem" | |
| sudo chown 48:48 "$installroot/var/www/html" | |
| sudo tee "$installroot/etc/httpd/conf.d/ssl.conf" >/dev/null <<\EOF | |
| Listen 443 | |
| <VirtualHost _default_:443> | |
| SSLEngine on | |
| SSLCertificateKeyFile /etc/pki/tls/private/mkcert-key.pem | |
| SSLCertificateFile /etc/pki/tls/certs/mkcert-cert.pem | |
| </VirtualHost> | |
| EOF | |
| sudo tee "$installroot/etc/httpd/conf.d/webroot.conf" >/dev/null <<\EOF | |
| <Directory "/var/www/html"> | |
| Options FollowSymLinks | |
| AllowOverride All | |
| Require all granted | |
| </Directory> | |
| EOF | |
| sudo machinectl start $name | |
| sudo systemctl -M $name enable systemd-networkd httpd | |
| sudo systemctl -M $name start systemd-networkd | |
| sudo systemctl -M $name start httpd | |
| sudo systemctl -M $name start mariadb | |
| sudo mkdir -p $installroot/root | |
| #Enter current password for root (enter for none): | |
| #Switch to unix_socket authentication y | |
| #Change the root password? n | |
| #Remove anonymous users? y | |
| #Disallow root login remotely? y | |
| #Remove test database and access to it? y | |
| #Reload privilege tables now? y | |
| sudo tee "$installroot/root/setup.sh" >/dev/null <<\EOF | |
| #!/bin/sh | |
| ROOT_SQLPASS=$(tr -dc _A-Za-z0-9 < /dev/urandom | head -c16) # Generate a random password | |
| DB_NAME="web" | |
| DB_USER="web" | |
| DB_PASS=$(tr -dc _A-Za-z0-9 < /dev/urandom | head -c16) | |
| DB_HOST="localhost" | |
| cat >/etc/my.cnf.d/charset.cnf <<EOB | |
| [mysqld] | |
| character-set-server = utf8mb4 | |
| [client] | |
| default-character-set = utf8mb4 | |
| EOB | |
| systemctl restart mariadb | |
| bash -c "echo -e '\ny\nn\ny\ny\ny\ny\n' | mysql_secure_installation" | |
| mysql -Bse "UPDATE mysql.global_priv SET priv=json_set(priv, '$.plugin', 'mysql_native_password', '$.authentication_string', PASSWORD('${ROOT_SQLPASS}')) WHERE User='root'; FLUSH PRIVILEGES;" | |
| echo -e "[client]\nuser=root\npassword=${ROOT_SQLPASS}" > /root/.my.cnf | |
| # TODO | |
| #GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,CREATE TEMPORARY TABLES | |
| mysql <<EOB | |
| DROP DATABASE IF EXISTS $DB_NAME; | |
| CREATE DATABASE $DB_NAME; | |
| GRANT ALL PRIVILEGES | |
| ON $DB_NAME.* | |
| TO $DB_USER@$DB_HOST | |
| IDENTIFIED BY '$DB_PASS'; | |
| FLUSH PRIVILEGES; | |
| EOB | |
| MY_CNF=/usr/share/httpd/.my.cnf | |
| cat >$MY_CNF << EOB | |
| [client] | |
| user=$DB_USER | |
| password=$DB_PASS | |
| host=$DB_HOST | |
| [mysql] | |
| database=$DB_NAME | |
| EOB | |
| chmod 600 $MY_CNF | |
| chown apache:apache $MY_CNF | |
| #sed -i -e 's/^#*max_allowed_packet.*/max_allowed_packet=1G/' /etc/mysql/mariadb.conf.d/50-server.cnf | |
| systemctl restart mariadb | |
| sed -i \ | |
| -e 's/^;*date.timezone *=.*/date.timezone = Europe\/Berlin/' \ | |
| -e 's/^;*max_input_vars *=.*/max_input_vars = 3000/' \ | |
| -e 's/^;*max_execution_time *=.*/max_execution_time = 240/' \ | |
| -e 's/^;*memory_limit *=.*/memory_limit = 384M/' \ | |
| -e 's/^;*post_max_size *=.*/post_max_size = 128M/' \ | |
| -e 's/^;*upload_max_filesize *=.*/upload_max_filesize = 128M/' \ | |
| -e 's/^;*opcache.enable_cli *=.*/opcache.enable_cli = 1/' \ | |
| /etc/php.ini | |
| systemctl restart php-fpm | |
| sed -i -e '/^apache:/s/sbin\/nologin/bin\/bash/' /etc/passwd | |
| EOF | |
| sudo chmod +x "$installroot/root/setup.sh" | |
| sudo machinectl shell $name /root/setup.sh | |
| # needs mymachines in /etc/nsswitch.conf "hosts:" line | |
| xdg-open "https://${name}" | |
| rm -fr "$tmpdir" | |
| #sudo $dnf clean all | |
| sudo du -hs "$installroot" |
Requires: systemd/systemd#30080
cd path/to/your/local/sources
# creates a container with the current directory mapped to /var/www/html and configures apache/php/mariadb.
create-webfedora.sh testsite