[WIP] Allow multiple installations of same blueprint (#88)
* Multi-install support, Blueprints and config changes. Initial commit * Migrating jails to blueprints, first steps. Tested Working: - Transmission - Lidarr - Sonarr - Radarr fix lidarr config (+10 squashed commit) Squashed commit: [5f14653] always link ports folders [f18f2f0] Optional (blueprint) ports mount Fixes #89 [96ef7e7] chmod all the things [129e707] same mistake... again... [e1596dc] missing reference [6da3567] Forgot one reference [d78b5b6] Update wiki.yml [cecc53a] Update filecheck.yml [5244abd] basic settings changed. More involved blueprints still need changes, such as: Bitwarden, nextcloud, Mariadb [6568e92] jails -> blueprints * Added Tested Working: - KMS - Plex - Tautulli - Organizr - InfluxDB - MariaDB Many squashed small fixes included: Make *.rc executable (+13 squashed commit) Squashed commit: [b28aa83] use .rc for rc.d config files [e940a48] some mariadb cleanup [dc27aff] testing another way [83bd91b] Mariadb root password alter instead of update, initial config for unifi [0ca3074] some light config cleanup [a0d4352] also remove database from influxdb example config (db should be created when required) [2c218cc] Prepare influxdb and remove unneeded content [1b34109] more shellcheck fixups [c96566c] Some shellcheck cleanup [8969ca7] bitwarden mostly done, some work on nextcloud and unifi [7f89bfa] initial mariadb patch [dd7e85f] missed one problem [f814cb7] Initial pseudo-compatibility patch for unifi * Enable Bitwarden support and some small fixes/tweaks Fixes #95 more bugs and typo's (+3 squashed commit) Squashed commit: [3b5213e] Bitwarden not correctly installing db [b7438a5] yeah thats not gonna cut it... >.< [e7987c2] some slight bitwarden tweaks * Enable Unifi support and some small fixes/tweaks small unifi cleanup. Unifi is working (+3 squashed commit) Squashed commit: [d906d2d] chmod unifi [545e999] Add extra sanity, remove unneeded variables from example [b8c0b24] Some small Unifi Tweaks * Nextcloud Cleanup, Some fixes, Initial support for blueprintsystem Fixes #96 Fixes #97 Fixes #98 some bloat and syntax fixes (+5 squashed commit) Squashed commit: [78f6428] Some more nextcloud cleanup and tweaks - combines multiple variables for cert system selection (Fixes #98 ) - Default to self signed cert - Force manual admin password [7cacae4] slight fixes [3d81cda] More cleanup [50496cc] small mariadb fix and more nextcloud cleanup [c1b2c20] Cleaning nextcloud - Remove external DB (Fixes #97 ) - Remove Postgresql (Fixes #96 ) - Some preparation for blueprint * Nextcloud done and.. another... (+5 squashed commit) Squashed commit: [c65751b] caddy not installed right. [e5da66b] more fixes [a33300e] Damnit, two typo's same scentence [4292a7a] another typo [1b820cf] typo and example hotfix * Introduce version checking for config file
This commit is contained in:
committed by
GitHub
parent
66e997069a
commit
dbfbd489fa
.github/workflows
blueprints
bitwarden
influxdb
jackett
kms
config.yml
includes
Activate_Office_2019_Pro.batActivate_Windows_10_Pro.batActivate_Windows_Server_2019_Standard.batOffice-2019-Pro-VLK-Config.xmlReadme.mdSetup_Office_2019_Pro.txtpy_kms.rc
install.shreadme.mdupdate.shlidarr
mariadb
nextcloud
LICENSEconfig.yml
includes
CaddyfileCaddyfile-nosslCaddyfile-selfsignedcaddy.rcmy-system.cnfmy.cnfpgpassphp.iniredis.confremove-staging.shwww-crontabwww.conf
install.shreadme.mdupdate.shorganizr
plex
radarr
sonarr
tautulli
transmission
unifi
jails
bitwarden
influxdb
jackett
kms
lidarr
mariadb
nextcloud
organizr
plex
radarr
sonarr
tautulli
transmission
unifi
3
blueprints/organizr/config.yml
Normal file
3
blueprints/organizr/config.yml
Normal file
@ -0,0 +1,3 @@
|
||||
blueprint:
|
||||
organizr:
|
||||
pkgs: nginx php72 php72-filter php72-curl php72-hash php72-json php72-openssl php72-pdo php72-pdo_sqlite php72-session php72-simplexml php72-sqlite3 php72-zip git
|
145
blueprints/organizr/includes/custom/organizr.conf
Normal file
145
blueprints/organizr/includes/custom/organizr.conf
Normal file
@ -0,0 +1,145 @@
|
||||
send_timeout 5m;
|
||||
proxy_read_timeout 240;
|
||||
proxy_send_timeout 240;
|
||||
proxy_connect_timeout 240;
|
||||
client_header_timeout 240;
|
||||
client_body_timeout 240;
|
||||
|
||||
|
||||
location / {
|
||||
root /usr/local/www/Organizr;
|
||||
index index.php index.html index.htm index.nginx-debian.html;
|
||||
location ~ /auth-(.*) {
|
||||
internal;
|
||||
rewrite ^/auth-(.*) /api/?v1/auth&group=$1;
|
||||
}
|
||||
error_page 400 401 402 403 404 405 408 500 502 503 504 $scheme://$server_name/?error=$status;
|
||||
location / {try_files $uri $uri/ =404;}
|
||||
include custom/phpblock.conf; #PHP Block
|
||||
}
|
||||
|
||||
|
||||
location /transmission/ {
|
||||
auth_request /auth-0;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
proxy_pass http://192.168.31.22:9091;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
location /sonarr/ {
|
||||
auth_request /auth-0;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
proxy_pass http://192.168.31.23:8989;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
location /radarr/ {
|
||||
auth_request /auth-0;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
proxy_pass http://192.168.31.24:7878;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
location /lidarr/ {
|
||||
auth_request /auth-0;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
proxy_pass http://192.168.31.25:8686;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
location /jackett/ {
|
||||
auth_request /auth-0;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
proxy_pass http://192.168.31.21:9117;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection keep-alive;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Host $http_host;
|
||||
}
|
||||
|
||||
location /plex/ {
|
||||
auth_request /auth-4;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
proxy_pass https://192.168.30.27:32400/;
|
||||
client_max_body_size 10m;
|
||||
client_body_buffer_size 128k;
|
||||
proxy_bind $server_addr;
|
||||
proxy_buffers 32 4k;
|
||||
#Timeout if the real server is dead
|
||||
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
|
||||
# Advanced Proxy Config
|
||||
send_timeout 5m;
|
||||
proxy_read_timeout 240;
|
||||
proxy_send_timeout 240;
|
||||
proxy_connect_timeout 240;
|
||||
proxy_hide_header X-Frame-Options;
|
||||
# Basic Proxy Config
|
||||
proxy_set_header Host $host:$server_port;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_redirect http:// $scheme://;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Connection "";
|
||||
proxy_no_cache $cookie_session;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
if ($http_referer ~* /plex/) {
|
||||
rewrite ^/web/(.*) /plex/web/$1? redirect;
|
||||
}
|
||||
|
||||
location /tautulli/ {
|
||||
auth_request /auth-4;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
proxy_pass http://192.168.31.26:8181;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-Host $server_name;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_read_timeout 90;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_set_header X-Forwarded-Ssl on;
|
||||
#proxy_redirect ~^(http(?:s)?://)([^:/]+)(?::\d+)?(/.*)?$ $1$2:$server_port$3;
|
||||
proxy_redirect off;
|
||||
}
|
||||
|
||||
location /ombi/ {
|
||||
auth_request /auth-4;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
proxy_pass https://192.168.31.27:3579/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection keep-alive;
|
||||
proxy_set_header Host $host;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
}
|
||||
|
||||
location /grafana {
|
||||
auth_request /auth-0;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
proxy_pass https://192.168.30.34/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
location /bitwarden {
|
||||
auth_request /auth-0;
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
proxy_pass https://bitwarden.schouten-lebbing.nl/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
9
blueprints/organizr/includes/custom/phpblock.conf
Normal file
9
blueprints/organizr/includes/custom/phpblock.conf
Normal file
@ -0,0 +1,9 @@
|
||||
fastcgi_read_timeout 240;
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||
fastcgi_pass unix:/var/run/php-fpm.sock;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $request_filename;
|
||||
include fastcgi_params;
|
||||
}
|
25
blueprints/organizr/includes/nginx.conf
Normal file
25
blueprints/organizr/includes/nginx.conf
Normal file
@ -0,0 +1,25 @@
|
||||
user www;
|
||||
worker_processes 1;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
include mime.types;
|
||||
default_type application/octet-stream;
|
||||
sendfile on;
|
||||
keepalive_timeout 65;
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
include custom/organizr.conf;
|
||||
}
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name localhost;
|
||||
include custom/organizr.conf;
|
||||
ssl_certificate /config/ssl/Organizr-Cert.crt; # Replace with actually valid certificate
|
||||
ssl_certificate_key /config/ssl/Organizr-Cert.key; # Replace with actually valid certificate
|
||||
}
|
||||
}
|
34
blueprints/organizr/install.sh
Executable file
34
blueprints/organizr/install.sh
Executable file
@ -0,0 +1,34 @@
|
||||
#!/usr/local/bin/bash
|
||||
# This file contains the install script for Organizr
|
||||
|
||||
iocage exec "$1" sed -i '' -e 's?listen = 127.0.0.1:9000?listen = /var/run/php-fpm.sock?g' /usr/local/etc/php-fpm.d/www.conf
|
||||
iocage exec "$1" sed -i '' -e 's/;listen.owner = www/listen.owner = www/g' /usr/local/etc/php-fpm.d/www.conf
|
||||
iocage exec "$1" sed -i '' -e 's/;listen.group = www/listen.group = www/g' /usr/local/etc/php-fpm.d/www.conf
|
||||
iocage exec "$1" sed -i '' -e 's/;listen.mode = 0660/listen.mode = 0600/g' /usr/local/etc/php-fpm.d/www.conf
|
||||
iocage exec "$1" cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
|
||||
iocage exec "$1" sed -i '' -e 's?;date.timezone =?date.timezone = "Universal"?g' /usr/local/etc/php.ini
|
||||
iocage exec "$1" sed -i '' -e 's?;cgi.fix_pathinfo=1?cgi.fix_pathinfo=0?g' /usr/local/etc/php.ini
|
||||
# shellcheck disable=SC2154
|
||||
mv /mnt/"${global_dataset_iocage}"/jails/"$1"/root/usr/local/etc/nginx/nginx.conf /mnt/"${global_dataset_iocage}"/jails/"$1"/root/usr/local/etc/nginx/nginx.conf.bak
|
||||
cp "${SCRIPT_DIR}"/blueprints/organizr/includes/nginx.conf /mnt/"${global_dataset_iocage}"/jails/"$1"/root/usr/local/etc/nginx/nginx.conf
|
||||
cp -Rf "${SCRIPT_DIR}"/blueprints/organizr/includes/custom /mnt/"${global_dataset_iocage}"/jails/"$1"/root/usr/local/etc/nginx/custom
|
||||
# shellcheck disable=SC2154
|
||||
if [ ! -d "/mnt/${global_dataset_config}/$1/ssl" ]; then
|
||||
echo "cert folder doesn't exist... creating..."
|
||||
iocage exec "$1" mkdir /config/ssl
|
||||
fi
|
||||
|
||||
if [ -f "/mnt/${global_dataset_config}/$1/ssl/Organizr-Cert.crt" ]; then
|
||||
echo "certificate exists... Skipping cert generation"
|
||||
else
|
||||
echo "No ssl certificate present, generating self signed certificate"
|
||||
openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=localhost" -keyout /mnt/"${global_dataset_config}"/"$1"/ssl/Organizr-Cert.key -out /mnt/"${global_dataset_config}"/"$1"/ssl/Organizr-Cert.crt
|
||||
fi
|
||||
|
||||
iocage exec "$1" git clone https://github.com/causefx/Organizr.git /usr/local/www/Organizr
|
||||
iocage exec "$1" chown -R www:www /usr/local/www /config /usr/local/etc/nginx/nginx.conf /usr/local/etc/nginx/custom
|
||||
iocage exec "$1" ln -s /config/config.php /usr/local/www/Organizr/api/config/config.php
|
||||
iocage exec "$1" sysrc nginx_enable=YES
|
||||
iocage exec "$1" sysrc php_fpm_enable=YES
|
||||
iocage exec "$1" service nginx start
|
||||
iocage exec "$1" service php-fpm start
|
101
blueprints/organizr/readme.md
Normal file
101
blueprints/organizr/readme.md
Normal file
@ -0,0 +1,101 @@
|
||||
# Organizr
|
||||
|
||||
## Original README from the Organizr github repo:
|
||||
|
||||
https://github.com/causefx/Organizr
|
||||
|
||||
|
||||
<p align="center"><img src="https://github.com/causefx/Organizr/raw/v2-develop/plugins/images/organizr/logo-wide.png"></p>
|
||||
|
||||
[](http://isitmaintained.com/project/causefx/Organizr "Percentage of issues still open")
|
||||
[](http://isitmaintained.com/project/causefx/Organizr "Average time to resolve an issue")
|
||||
[](https://github.com/causefx/Organizr/stargazers)
|
||||
[](https://github.com/causefx/Organizr/network)
|
||||
[](https://hub.docker.com/r/organizrtools/organizr-v2)
|
||||
[](https://paypal.me/causefx)
|
||||
[](https://beerpay.io/causefx/Organizr) [](https://beerpay.io/causefx/Organizr?focus=wish)
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/16184466/53614282-a91e9e00-3b96-11e9-9b3e-d249775ecaa1.png">
|
||||
|
||||
Do you have quite a bit of services running on your computer or server? Do you have a lot of bookmarks or have to memorize a bunch of ip's and ports? Well, Organizr is here to help with that. Organizr allows you to setup "Tabs" that will be loaded all in one webpage. You can then work on your server with ease. Want to give users access to some Tabs? No problem, just enable user support and have them make an account. Want guests to be able to visit too? Enable Guest support for those tabs.
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/16184466/53614285-a9b73480-3b96-11e9-835e-9fadd045582b.png">
|
||||
|
||||
- PHP 7.1.3+
|
||||
- [Official Site](https://organizr.app) - Will be refreshed soon!
|
||||
- [Official Discord](https://organizr.app/discord)
|
||||
- [See Wiki](https://github.com/causefx/Organizr/wiki) - Will be updated soon!
|
||||
- [Docker](https://hub.docker.com/r/organizrtools/organizr-v2/)
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/16184466/53614284-a9b73480-3b96-11e9-9bea-d7a30b294267.png">
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/16184466/53615855-35cc5a80-3b9d-11e9-882b-f09f3eb18173.png" width="23%"></img> <img src="https://user-images.githubusercontent.com/16184466/53615856-35cc5a80-3b9d-11e9-8428-1f2ae05da2c9.png" width="23%"></img> <img src="https://user-images.githubusercontent.com/16184466/53615857-35cc5a80-3b9d-11e9-82bf-91987c529e72.png" width="23%"></img> <img src="https://user-images.githubusercontent.com/16184466/53615858-35cc5a80-3b9d-11e9-8149-01a7fcd9160a.png" width="23%"></img>
|
||||
|
||||
[](https://www.youtube.com/watch?v=LZL4smFB6wU)
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/16184466/53614283-a9b73480-3b96-11e9-90ef-6e752e067884.png">
|
||||
|
||||
- Login with Plex/Emby/LDAP or sFTP credentials
|
||||
- Custom tabs for your services
|
||||
- Fullscreen Support
|
||||
- Pin/Unpin sidebar
|
||||
- Mobile support
|
||||
- Set default page on launch
|
||||
- Upload new icons with ease
|
||||
- Enable or disable iFrame for your tabs
|
||||
- User management support: Create, delete and promote users from the user management console
|
||||
- Unlimited User Groups
|
||||
- Theme-able
|
||||
- Personalise any theme: Customise the look and feel of Organizr with access to the colour palette
|
||||
- Organizr login log viewer
|
||||
- Fail2ban support (see wiki)
|
||||
- Nginx Auth_Request support
|
||||
- Protect new user account creation with registration password
|
||||
- 'Forgot Password' support [receive an email with your new password, prerequisites: mail server setup]
|
||||
- Multiple login support
|
||||
- Keyboard shortcut support (Check help tab in settings)
|
||||
- Gravatar Support
|
||||
- Customise the top bar by adding your own site logo or site name
|
||||
- Additional language support
|
||||
- Quick access tabs [access your tabs quickly e.g. www.example.com/#Sonarr]
|
||||
- Many more...
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/16184466/53614286-a9b73480-3b96-11e9-8495-4944b85b1313.png">
|
||||
|
||||
[](http://feathub.com/causefx/Organizr)
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/16184466/53667702-fcdcc600-3c2e-11e9-8828-860e531e8096.png">
|
||||
|
||||
##### Usage
|
||||
```
|
||||
docker create \
|
||||
--name=organizr \
|
||||
-v <path to data>:/config \
|
||||
-e PGID=<gid> -e PUID=<uid> \
|
||||
-p 80:80 \
|
||||
organizrtools/organizr-v2
|
||||
```
|
||||
##### Parameters
|
||||
The parameters are split into two halves, separated by a colon, the left hand side representing the host and the right the container side. For example with a port -p external:internal - what this shows is the port mapping from internal to external of the container. So `-p 8080:80` would expose port 80 from inside the container to be accessible from the host's IP on port 8080 and `http://192.168.x.x:8080` would show you what's running INSIDE the container on port 80.
|
||||
|
||||
* `-p 80` - The port(s)
|
||||
* `-v /config` - Mapping the config files for Organizr
|
||||
* `-e PGID` Used for GroupID - see below for explanation
|
||||
* `-e PUID` Used for UserID - see below for explanation
|
||||
|
||||
##### Info
|
||||
* Shell access whilst the container is running: `docker exec -it organizr /bin/bash`
|
||||
* To monitor the logs of the container in realtime: `docker logs -f organizr`
|
||||
* Container version number: `docker inspect -f '{{ index .Config.Labels "build_version" }}' organizr`
|
||||
* Image version number: `docker inspect -f '{{ index .Config.Labels "build_version" }}' organizrtools/docker-organizr-v2`
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/16184466/53614287-a9b73480-3b96-11e9-9c8e-e32b4ae20c0d.png">
|
||||
|
||||
<p align="center"><a href="https://www.browserstack.com"><img src="https://avatars2.githubusercontent.com/u/1119453?s=200&v=4g"></a></p>
|
||||
<p align="center"><a href="https://www.browserstack.com">BrowserStack</a> for allowing us to use their platform for testing</p>
|
||||
<p>This project is supported by:</p>
|
||||
<p>
|
||||
<a href="https://www.digitalocean.com/">
|
||||
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_blue.svg" width="201px">
|
||||
</a>
|
||||
</p>
|
12
blueprints/organizr/update.sh
Executable file
12
blueprints/organizr/update.sh
Executable file
@ -0,0 +1,12 @@
|
||||
#!/usr/local/bin/bash
|
||||
# This file contains the update script for Organizr
|
||||
|
||||
iocage exec "$1" service nginx stop
|
||||
iocage exec "$1" service php-fpm stop
|
||||
# TODO setup cli update for Organizr here.
|
||||
# shellcheck disable=SC2154
|
||||
cp "${SCRIPT_DIR}"/blueprints/organizr/includes/nginx.conf /mnt/"${global_dataset_iocage}"/jails/"$1"/root/usr/local/etc/nginx/nginx.conf
|
||||
iocage exec "$1" "cd /usr/local/www/Organizr && git pull"
|
||||
iocage exec "$1" chown -R www:www /usr/local/www /config /usr/local/etc/nginx/nginx.conf /usr/local/etc/nginx/custom
|
||||
iocage exec "$1" service nginx start
|
||||
iocage exec "$1" service php-fpm start
|
Reference in New Issue
Block a user