#!/bin/bash toolName="pixelfed" toolTag="dev" toolDeps="composer jpegoptim php7.3-bcmath php-imagick" toolPath="/var/www/pixelfed" step_1_info() { echo "Updating apt"; } step_1_alias() { ALIAS="install"; } step_1() { exe apt update } step_2_info() { echo -e "Installing $toolName dependencies: $toolDeps"; } step_2() { exe apt install $toolDeps -y endReturn -o $? "Installing deps for $toolName failed" exe service php7.3-fpm restart endReturn -o $? "Problems starting $toolName" } step_3_info() { echo -e "Get $toolName using git"; } step_3() { exe git clone -b $toolTag https://github.com/pixelfed/pixelfed.git $toolPath exe cd $toolPath exe chown -R www-data:www-data . # change user/group to http user and http group exe find . -type d -exec chmod 755 {} \; # set all directories to rwx by user/group exe find . -type f -exec chmod 644 {} \; # set all files to rw by user/group exe composer install --no-ansi --no-interaction --optimize-autoloader endReturn -o $? "Composer install error" } step_4_info() { echo "Create mysql database for $toolName"; } step_4() { local mysqlDatabase local mysqlUser local mysqlPass echo "Existing mysql databases:" exe mysql -u root -e 'SHOW DATABASES;' echo -en "Enter database name: " exe read mysqlDatabase endCheckEmpty mysqlDatabase "database name" exe mysql -u root -e 'CREATE DATABASE '$mysqlDatabase' CHARACTER SET utf8mb4;' endReturn -o $? "Creating database failed" echo "Existing mysql user:" exe mysql -u root -e 'SELECT User, Host FROM mysql.user;' echo -en "Enter mysql user name: " read mysqlUser endCheckEmpty mysqlDatabase "user name" echo -en "Enter mysql user password: " read -s mysqlPass endCheckEmpty mysqlPass "password" exe mysql -u root -e 'CREATE USER '"'"$mysqlUser"'"'@'"'"'localhost'"'"' IDENTIFIED BY '"'"$mysqlPass"'"';' endReturn -o $? "Creating database user \"${mysqlUser}\" failed"; exe mysql -u root -e 'GRANT ALL PRIVILEGES ON '$mysqlDatabase'.* TO '"'"$mysqlUser"'"'@'"'"'localhost'"'"';' endReturn -o $? "Granting privileges for user \"${mysqlUser}\" failed"; exe mysql -u root -e 'FLUSH PRIVILEGES;' } step_5_info() { echo "$toolName configuration"; } step_5() { exe cd $toolPath exe cp .env.example .env exe read -p "Edit database settings, hostname, email settings, IMAGE_DRIVER=imagick, etc... (Enter to continue)" exe vi .env exe php artisan key:generate exe php artisan config:cache exe php artisan storage:link exe php artisan migrate --force exe php artisan route:cache } step_6_info() { echo "Create admin user"; } step_6() { exe cd $toolPath exe read -p "Create admin user. (Enter to continue)" exe php artisan user:create } step_7_info() { echo "Create pixelfed (horzion) service"; } step_7() { addConf -c "${horizonService}" "${horizonServiceLoc}" endReturn -o $? "Failed to add horizon service" exe systemctl daemon-reload exe systemctl enable pixelfed.service exe service pixelfed start } horizonServiceLoc="/etc/systemd/system/pixelfed.service" horizonService="\ [Unit] Description=${toolName}s' Horizon After=syslog.target After=network.target #Requires=mysql.service Requires=mariadb.service #Requires=postgresql.service #Requires=memcached.service #Requires=redis.service [Service] # Modify these two values and uncomment them if you have # repos with lots of files and get an HTTP error 500 because # of that ### #LimitMEMLOCK=infinity #LimitNOFILE=65535 RestartSec=2s Type=simple User=www-data Group=www-data WorkingDirectory=${toolPath}/ ExecStart=/usr/bin/php ${toolPath}/artisan horizon Restart=always Environment= [Install] WantedBy=multi-user.target" step_8_info() { echo "Create scheduler cron job"; } step_8_alias() { ALIAS="scheduler"; } step_8() { addConf -s "$schedulerCmd" "$schedulerCron" } schedulerCron="/etc/cron.d/pixelfedScheduler" schedulerCmd="* * * * * cd ${toolPath} && php artisan schedule:run >>/dev/null 2>&1" step_9_info() { echo "Nginx configuration"; } step_9() { addConf -c "$nginxConfig" "$nginxConfigLoc" exe ln -s "$nginxConfigLoc" "$nginxConfigEnable" exe nginx -t endReturn -o $? "Nginx configuration check error" exe service nginx restart } nginxConfigLoc="/etc/nginx/sites-available/pixelfed" nginxConfigEnable="/etc/nginx/sites-enabled/pixelfed" nginxConfig="\ upstream php-handler-pixel { server unix:/var/run/php/php7.3-fpm.sock; } map \$http_x_forwarded_proto \$proxy_https { default ''; https 'on'; } server { listen 80; listen [::]:80; add_header X-Frame-Options \"SAMEORIGIN\"; add_header X-XSS-Protection \"1; mode=block\"; add_header X-Content-Type-Options \"nosniff\"; # Path to the root of your installation root ${toolPath}/public; index index.html index.htm index.php; charset utf-8; client_max_body_size 64M; location / { try_files \$uri \$uri/ /index.php?\$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ \\.php$ { try_files \$uri =404; fastcgi_split_path_info ^(.+\\.php)(/.+)$; fastcgi_pass php-handler-pixel; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME \$request_filename; fastcgi_param PATH_INFO \$fastcgi_path_info; # fix preview problem fastcgi_param REQUEST_SCHEME \$http_x_forwarded-proto; fastcgi_param HTTPS \$proxy_https if_not_empty; } location ~ /\\.(?!well-known).* { deny all; } }" step_20_info() { echo "Reload configuration (.env)"; } step_20_alias() { ALIAS="newenv"; } step_20() { exe cd $toolPath exe php artisan config:cache exe service pixelfed restart } step_22_info() { echo "Create new user"; } step_22_alias() { ALIAS="createuser"; } step_22() { exe cd $toolPath exe php artisan user:create } step_24_info() { echo "Checkout to dev branch. Losing local changes!"; } step_24_alias() { ALIAS="forcedev"; } step_24() { exe read -p "Are you sure: y/[n]? " answer if [ $DRY -eq 0 ] ; then case $answer in [yY]) ;; *) return 1 ;; esac fi exe cd $toolPath exe git fetch --all exe git reset --hard origin/dev exe git pull origin dev exe git checkout dev } step_100_info() { echo "Upgrade \"${toolPath}\" to supported tag $toolTag"; } step_100_alias() { ALIAS="upgrade"; } step_100() { exe cd $toolPath exe git pull origin $toolTag endReturn -o $? "git pull failed" exe git checkout $toolTag endReturn -o $? "git checkout failed" } step_101_info() { echo "Recommended post update procedure"; } step_101_alias() { ALIAS="postupdate"; } step_101() { exe cd $toolPath exe composer install exe php artisan config:cache exe php artisan route:cache exe php artisan view:cache exe php artisan migrate --force exe php artisan horizon:purge exe php artisan storage:link echo -n " [I] Restarting pixelfed horzion service..." exe service pixelfed restart && echo "ok" } # Sequence Revision VERSION_SEQREV=7 # Path to sequencer . sequencer.sh