mirror of
https://github.com/PhyreApps/PhyrePanel.git
synced 2024-11-21 15:10:25 +00:00
update
This commit is contained in:
parent
bef4d9816c
commit
a9d5fc38a1
1134 changed files with 42316 additions and 1 deletions
103
.github/workflows/app-unit-test.yml
vendored
Normal file
103
.github/workflows/app-unit-test.yml
vendored
Normal file
|
@ -0,0 +1,103 @@
|
|||
name: Phyre Panel - Unit Test & Build
|
||||
on: [push]
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
phyre-panel-unit-test:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-22.04, ubuntu-20.04]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: ${{ github.repository }}
|
||||
ref: ${{ github.sha }}
|
||||
|
||||
- name: Install Base
|
||||
run: |
|
||||
ls -la
|
||||
sudo mkdir /phyre-panel
|
||||
|
||||
sudo cp installers/${{ matrix.os }}/install-partial/install_base.sh /phyre-panel/install_base.sh
|
||||
sudo chmod +x /phyre-panel/install_base.sh
|
||||
sudo /phyre-panel/install_base.sh
|
||||
|
||||
sudo cp installers/${{ matrix.os }}/install-partial/install_web.sh /phyre-panel/install_web.sh
|
||||
sudo chmod +x /phyre-panel/install_web.sh
|
||||
|
||||
- name: Run Unit Test
|
||||
run: |
|
||||
|
||||
sudo cp -r web /usr/local/phyre/web/
|
||||
cd /usr/local/phyre/web/
|
||||
ls -la
|
||||
|
||||
sudo wget https://getcomposer.org/download/latest-stable/composer.phar
|
||||
sudo COMPOSER_ALLOW_SUPERUSER=1 phyre-php composer.phar install
|
||||
|
||||
sudo /phyre-panel/install_web.sh
|
||||
sudo phyre-php artisan test
|
||||
|
||||
compile-phyre-web-panel:
|
||||
runs-on: ubuntu-22.04
|
||||
needs: phyre-panel-unit-test
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: ${{ github.repository }}
|
||||
- name: Npm install
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: 8.2
|
||||
|
||||
- name: Install Composer Dependencies
|
||||
working-directory: ./web
|
||||
run: |
|
||||
composer install
|
||||
composer dump-autoload
|
||||
|
||||
- name: Install NODE Dependencies
|
||||
working-directory: ./web
|
||||
run: |
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
- name: Inject slug/short variables
|
||||
uses: rlespinasse/github-slug-action@v3.x
|
||||
|
||||
- name: Zip the files
|
||||
working-directory: ./web
|
||||
run: |
|
||||
rm -rf .git
|
||||
rm -rf .github
|
||||
rm -rf .nmp
|
||||
rm -rf node_modules
|
||||
rm -rf .phpunit.cache
|
||||
rm -rf vendor/composer/tmp-*.zip
|
||||
find . \( -name ".git" -o -name ".gitignore" -o -name ".gitmodules" -o -name ".gitattributes" \) -exec rm -rf -- {} +
|
||||
zip -r phyre-web-panel-build.zip `ls -A`
|
||||
mkdir -p ../dist
|
||||
mv ./phyre-web-panel-build.zip ../dist/phyre-web-panel.zip
|
||||
|
||||
- name: Pushes to Phyre Panel Dist Repo
|
||||
uses: cpina/github-action-push-to-another-repository@main
|
||||
env:
|
||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||
API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
with:
|
||||
source-directory: './dist'
|
||||
destination-github-username: 'CloudVisionApps'
|
||||
destination-repository-name: 'PhyrePanelWebDist'
|
||||
user-email: bobicloudvision@gmail.com
|
||||
target-branch: main
|
66
.github/workflows/compile-web-panel.yml.stop-for-now
vendored
Normal file
66
.github/workflows/compile-web-panel.yml.stop-for-now
vendored
Normal file
|
@ -0,0 +1,66 @@
|
|||
name: Compile Phyre Web Panel
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
compile-phyre-web-panel:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: ${{ github.repository }}
|
||||
- name: Npm install
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: 8.2
|
||||
|
||||
- name: Install Composer Dependencies
|
||||
working-directory: ./web
|
||||
run: |
|
||||
composer install
|
||||
composer dump-autoload
|
||||
|
||||
- name: Install NODE Dependencies
|
||||
working-directory: ./web
|
||||
run: |
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
- name: Inject slug/short variables
|
||||
uses: rlespinasse/github-slug-action@v3.x
|
||||
|
||||
- name: Zip the files
|
||||
working-directory: ./web
|
||||
run: |
|
||||
rm -rf .git
|
||||
rm -rf .github
|
||||
rm -rf .nmp
|
||||
rm -rf node_modules
|
||||
rm -rf .phpunit.cache
|
||||
rm -rf vendor/composer/tmp-*.zip
|
||||
find . \( -name ".git" -o -name ".gitignore" -o -name ".gitmodules" -o -name ".gitattributes" \) -exec rm -rf -- {} +
|
||||
zip -r phyre-web-panel-build.zip `ls -A`
|
||||
mkdir -p ../dist
|
||||
mv ./phyre-web-panel-build.zip ../dist/phyre-web-panel.zip
|
||||
|
||||
- name: Pushes to Phyre Panel Dist Repo
|
||||
uses: cpina/github-action-push-to-another-repository@main
|
||||
env:
|
||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||
API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
with:
|
||||
source-directory: './dist'
|
||||
destination-github-username: 'CloudVisionApps'
|
||||
destination-repository-name: 'PhyrePanelWebDist'
|
||||
user-email: bobicloudvision@gmail.com
|
||||
target-branch: main
|
42
.github/workflows/compile-web-terminal-package.yml
vendored
Normal file
42
.github/workflows/compile-web-terminal-package.yml
vendored
Normal file
|
@ -0,0 +1,42 @@
|
|||
name: Compile Phyre Web Terminal Package
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
# Pattern matched against refs/tags
|
||||
tags:
|
||||
- '**'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile WEB Terminal Package
|
||||
run: |
|
||||
cd compilators/debian/web-terminal
|
||||
chmod 775 ./web-terminal-compile.sh
|
||||
./web-terminal-compile.sh
|
||||
ls
|
||||
|
||||
- name: Pushes to Phyre Panel Dist Repo
|
||||
uses: cpina/github-action-push-to-another-repository@main
|
||||
env:
|
||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||
API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }}
|
||||
with:
|
||||
source-directory: './compilators/debian/web-terminal/dist'
|
||||
target-directory: './debian/web-terminal/dist'
|
||||
destination-github-username: 'CloudVisionApps'
|
||||
destination-repository-name: 'PhyrePanelWebTerminalDist'
|
||||
user-email: bobicloudvision@gmail.com
|
||||
target-branch: main
|
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
web/storage/installed
|
||||
/docker/e2e-tests/node_modules/
|
||||
compilators/
|
||||
web/thirdparty/
|
44
README.md
44
README.md
|
@ -1 +1,43 @@
|
|||
# PhyrePanel
|
||||
# PHYRE - WEB HOSTING PANEL
|
||||
|
||||
![InstallScreen](screenshots/install-screen.png)
|
||||
![Dashboard](screenshots/dashboard.png)
|
||||
|
||||
## Introduction
|
||||
PhyrePanel is a web-based panel for linux. It is written in PHP and uses the Laravel framework.
|
||||
|
||||
## Installation
|
||||
To install PhyrePanel, you need to run this commands:
|
||||
```
|
||||
wget https://raw.githubusercontent.com/CloudVisionApps/PhyrePanel/main/installers/install.sh && chmod +x install.sh && ./install.sh
|
||||
```
|
||||
The admin panel can be opened on port: yourserver.com:8443
|
||||
|
||||
## Features
|
||||
|
||||
### Server Applications
|
||||
Apache + PHP 7.4, 8.0, 8.1, 8.3, 8.4
|
||||
|
||||
Apache + NGINX
|
||||
|
||||
Apache + Python
|
||||
|
||||
Apache + Ruby
|
||||
|
||||
### Databases
|
||||
MySQL
|
||||
|
||||
SQLITE
|
||||
|
||||
Remote Database Connections
|
||||
|
||||
### UI/UX / Developing
|
||||
Clean Admin Panel
|
||||
|
||||
Server Clustering
|
||||
|
||||
Easy Module Developing
|
||||
|
||||
## Join to our discord group
|
||||
https://discord.gg/yfFWfrfwTZ
|
||||
|
||||
|
|
1
bin/apache-website-create.sh
Normal file
1
bin/apache-website-create.sh
Normal file
|
@ -0,0 +1 @@
|
|||
ls
|
19
bin/cron-job-add.sh
Normal file
19
bin/cron-job-add.sh
Normal file
|
@ -0,0 +1,19 @@
|
|||
#!/bin/bash
|
||||
|
||||
username=$1
|
||||
schedule=$2
|
||||
command=$3
|
||||
|
||||
# Create a temporary file to hold the existing user's crontab
|
||||
crontab -u $username -l > /tmp/temp_crontab
|
||||
|
||||
# Add a new cron job to the temporary file
|
||||
echo "$schedule $command" >> /tmp/temp_crontab
|
||||
|
||||
# Install the modified crontab from the temporary file
|
||||
crontab -u $username /tmp/temp_crontab
|
||||
|
||||
# Remove the temporary file
|
||||
rm /tmp/temp_crontab
|
||||
|
||||
echo "done!"
|
10
bin/cron-job-delete.sh
Normal file
10
bin/cron-job-delete.sh
Normal file
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
username=$1
|
||||
schedule=$2
|
||||
command=$3
|
||||
|
||||
# Get the user's crontab, filter out the specific command and schedule, and install the updated crontab
|
||||
crontab -u $username -l | grep -v -F "$schedule $command" | crontab -u $username -
|
||||
|
||||
echo "done!"
|
7
bin/cron-jobs-list.sh
Normal file
7
bin/cron-jobs-list.sh
Normal file
|
@ -0,0 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Replace 'username' with the actual username you want to retrieve cron jobs for
|
||||
username=$1
|
||||
|
||||
# Get the user's crontab entries and convert them to JSON
|
||||
crontab -u $username -l | grep -v -e '^#' -e '^\s*$' | awk '{print "{\"schedule\":\"" $1 " " $2 " " $3 " " $4 " " $5 "\", \"command\":\"" substr($0, index($0,$6)) "\"}"}' | jq -s .
|
22
bin/mysql-create-db-and-user.sh
Normal file
22
bin/mysql-create-db-and-user.sh
Normal file
|
@ -0,0 +1,22 @@
|
|||
#!/bin/bash
|
||||
|
||||
echo "Creating MySQL user and database"
|
||||
|
||||
PASS=$3
|
||||
if [ -z "$3" ]; then
|
||||
PASS=`openssl rand -base64 8`
|
||||
fi
|
||||
|
||||
mysql -u root <<MYSQL_SCRIPT
|
||||
CREATE DATABASE $1;
|
||||
CREATE USER '$2'@'localhost' IDENTIFIED BY '$PASS';
|
||||
GRANT ALL PRIVILEGES ON $1.* TO '$2'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
echo "MySQL user and database created."
|
||||
echo "Database: $1"
|
||||
echo "Username: $2"
|
||||
echo "Password: $PASS"
|
||||
echo "Success!"
|
||||
|
34
bin/nginx-website-create.sh
Normal file
34
bin/nginx-website-create.sh
Normal file
|
@ -0,0 +1,34 @@
|
|||
#!/bin/bash
|
||||
|
||||
DOMAIN=$1
|
||||
USER=$2
|
||||
|
||||
# Path to NGINX sites-available directory
|
||||
SITES_AVAILABLE_DIR="/etc/nginx/sites-available"
|
||||
SITES_ENABLED_DIR="/etc/nginx/sites-enabled"
|
||||
|
||||
# Create the site
|
||||
SERVER_ROOT="/var/www/$DOMAIN/public_html"
|
||||
|
||||
cp -f /usr/local/phyre/samples/ubuntu/nginx.conf.sample $SITES_AVAILABLE_DIR/$DOMAIN.conf
|
||||
ln -s $SITES_AVAILABLE_DIR/$DOMAIN.conf $SITES_ENABLED_DIR/$DOMAIN.conf
|
||||
|
||||
mkdir -p $SERVER_ROOT
|
||||
chown -R www-data:www-data $SERVER_ROOT
|
||||
|
||||
# Replace the domain name in the NGINX config
|
||||
sed -i "s/%SERVER_NAME%/${DOMAIN}/g" $SITES_AVAILABLE_DIR/$DOMAIN.conf
|
||||
sed -i "s/%USER%/${USER}/g" $SITES_AVAILABLE_DIR/$DOMAIN.conf
|
||||
|
||||
SERVER_ROOT_ESCAPED=$(printf '%s\n' "$SERVER_ROOT" | sed -e 's/[\/&]/\\&/g')
|
||||
sed -i "s#%SERVER_ROOT%#${SERVER_ROOT_ESCAPED}#g" $SITES_AVAILABLE_DIR/$DOMAIN.conf
|
||||
|
||||
cp -f /usr/local/phyre/samples/sample-website-index.html $SERVER_ROOT/index.html
|
||||
sed -i "s/%DOMAIN%/${DOMAIN}/g" $SERVER_ROOT/index.html
|
||||
|
||||
|
||||
# Reload NGINX
|
||||
service nginx reload
|
||||
|
||||
echo "Created site $DOMAIN"
|
||||
echo "done!"
|
16
bin/nginx-website-delete.sh
Normal file
16
bin/nginx-website-delete.sh
Normal file
|
@ -0,0 +1,16 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Path to NGINX sites-available directory
|
||||
SITES_AVAILABLE_DIR="/etc/nginx/sites-available"
|
||||
SITES_ENABLED_DIR="/etc/nginx/sites-enabled"
|
||||
|
||||
# Delete the site
|
||||
rm -rf $SITES_AVAILABLE_DIR/$1.conf
|
||||
rm -rf $SITES_ENABLED_DIR/$1.conf
|
||||
rm -rf /var/www/$1
|
||||
|
||||
# Reload NGINX
|
||||
service nginx reload
|
||||
|
||||
echo "Deleted site $1"
|
||||
echo "done!"
|
24
bin/nginx-websites-list.sh
Normal file
24
bin/nginx-websites-list.sh
Normal file
|
@ -0,0 +1,24 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Path to NGINX sites-available directory
|
||||
sites_available_dir="/etc/nginx/sites-available"
|
||||
|
||||
# Array to hold site configurations
|
||||
declare -a sites_array=()
|
||||
|
||||
# Loop through NGINX site configuration files and collect data
|
||||
for file in "$sites_available_dir"/*; do
|
||||
if [ -f "$file" ] && [ "$(basename "$file")" != "default" ]; then
|
||||
server_name=$(awk '$1 == "server_name" {gsub(/;/, "", $2); print $2; exit}' "$file")
|
||||
root=$(awk '$1 == "root" {gsub(/;/, "", $2); print $2; exit}' "$file")
|
||||
|
||||
# Append site data to the array
|
||||
sites_array+=("{\"file\": \"$file\", \"server_name\": \"$server_name\", \"root\": \"$root\"}")
|
||||
fi
|
||||
done
|
||||
|
||||
# Convert array to JSON
|
||||
json_output=$(printf '%s\n' "${sites_array[@]}" | jq -s '.')
|
||||
|
||||
# Output JSON
|
||||
echo "$json_output"
|
13
docker-compose.yml
Normal file
13
docker-compose.yml
Normal file
|
@ -0,0 +1,13 @@
|
|||
services:
|
||||
phyre:
|
||||
build:
|
||||
context: ./docker
|
||||
dockerfile: Dockerfile
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
- "3306:3306"
|
||||
- "8443:8443"
|
||||
volumes:
|
||||
- .:/usr/local/phyre
|
||||
|
34
docker/.dockerignore
Normal file
34
docker/.dockerignore
Normal file
|
@ -0,0 +1,34 @@
|
|||
# Include any files or directories that you don't want to be copied to your
|
||||
# container here (e.g., local build artifacts, temporary files, etc.).
|
||||
#
|
||||
# For more help, visit the .dockerignore file reference guide at
|
||||
# https://docs.docker.com/go/build-context-dockerignore/
|
||||
|
||||
**/.DS_Store
|
||||
**/__pycache__
|
||||
**/.venv
|
||||
**/.classpath
|
||||
**/.dockerignore
|
||||
**/.env
|
||||
**/.git
|
||||
**/.gitignore
|
||||
**/.project
|
||||
**/.settings
|
||||
**/.toolstarget
|
||||
**/.vs
|
||||
**/.vscode
|
||||
**/*.*proj.user
|
||||
**/*.dbmdl
|
||||
**/*.jfm
|
||||
**/bin
|
||||
**/charts
|
||||
**/docker-compose*
|
||||
**/compose*
|
||||
**/Dockerfile*
|
||||
**/node_modules
|
||||
**/npm-debug.log
|
||||
**/obj
|
||||
**/secrets.dev.yaml
|
||||
**/values.dev.yaml
|
||||
LICENSE
|
||||
README.md
|
116
docker/Dockerfile
Normal file
116
docker/Dockerfile
Normal file
|
@ -0,0 +1,116 @@
|
|||
# syntax=docker/dockerfile:1
|
||||
|
||||
FROM ubuntu:22.04
|
||||
LABEL maintainer="CloudVisionApps1"
|
||||
|
||||
# Install initial dependencies
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y wget dos2unix ca-certificates \
|
||||
&& apt-get install -y \
|
||||
jq \
|
||||
curl \
|
||||
wget \
|
||||
unzip \
|
||||
zip \
|
||||
tar \
|
||||
mysql-common \
|
||||
mysql-server \
|
||||
mysql-client \
|
||||
lsb-release \
|
||||
gnupg2 \
|
||||
ca-certificates \
|
||||
apt-transport-https \
|
||||
software-properties-common \
|
||||
supervisor \
|
||||
libonig-dev \
|
||||
libsodium23 \
|
||||
libpq5 \
|
||||
libzip-dev \
|
||||
libcurl4-openssl-dev \
|
||||
libssl-dev \
|
||||
zlib1g-dev
|
||||
|
||||
# Start MySQL service
|
||||
RUN service mysql start
|
||||
|
||||
# Set up environment variables
|
||||
ENV INSTALL_DIR="/phyre/install" \
|
||||
MYSQL_PHYRE_ROOT_USERNAME="phyre" \
|
||||
PHYRE_PHP="/usr/local/phyre/php/bin/php"
|
||||
|
||||
# Create installation directory
|
||||
RUN mkdir -p $INSTALL_DIR
|
||||
|
||||
# Change directory to installation directory
|
||||
WORKDIR $INSTALL_DIR
|
||||
|
||||
# Install PHYRE PHP
|
||||
RUN wget https://github.com/CloudVisionApps/PhyrePanelPHPDist/raw/main/debian/php/dist/phyre-php-8.2.0.deb \
|
||||
&& dpkg -i phyre-php-8.2.0.deb
|
||||
|
||||
# Install PHYRE NGINX
|
||||
RUN wget https://github.com/CloudVisionApps/PhyrePanelNginxDist/raw/main/debian/nginx/dist/phyre-nginx-1.24.0.deb \
|
||||
&& dpkg -i phyre-nginx-1.24.0.deb
|
||||
|
||||
# Start PHYRE service
|
||||
RUN service phyre start
|
||||
|
||||
# Create symbolic link for PHYRE PHP
|
||||
RUN ln -s $PHYRE_PHP /usr/bin/phyre-php
|
||||
|
||||
# Set permissions
|
||||
RUN chmod 711 /home \
|
||||
&& chmod -R 750 /usr/local/phyre
|
||||
|
||||
# Change directory to web directory
|
||||
WORKDIR /usr/local/phyre/web
|
||||
|
||||
# Create MySQL user
|
||||
RUN mysql -uroot -proot -e "CREATE USER '$MYSQL_PHYRE_ROOT_USERNAME'@'%' IDENTIFIED BY '$MYSQL_PHYRE_ROOT_PASSWORD'; \
|
||||
GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_PHYRE_ROOT_USERNAME'@'%' WITH GRANT OPTION; \
|
||||
FLUSH PRIVILEGES;"
|
||||
|
||||
# Create database
|
||||
RUN PANEL_DB_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)" \
|
||||
&& PANEL_DB_NAME="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)" \
|
||||
&& PANEL_DB_USER="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)" \
|
||||
&& mysql -uroot -proot -e "CREATE DATABASE $PANEL_DB_NAME; \
|
||||
CREATE USER '$PANEL_DB_USER'@'localhost' IDENTIFIED BY '$PANEL_DB_PASSWORD'; \
|
||||
GRANT ALL PRIVILEGES ON $PANEL_DB_NAME.* TO '$PANEL_DB_USER'@'localhost'; \
|
||||
FLUSH PRIVILEGES;"
|
||||
|
||||
# Secure MySQL installation
|
||||
RUN mysql_secure_installation --use-default
|
||||
|
||||
# Change MySQL root password
|
||||
RUN MYSQL_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)" \
|
||||
&& mysql -uroot -proot -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '$MYSQL_ROOT_PASSWORD'; \
|
||||
FLUSH PRIVILEGES;"
|
||||
|
||||
# Save MySQL root password
|
||||
RUN echo "$MYSQL_ROOT_PASSWORD" > /root/.phyre_mysql_root_password
|
||||
|
||||
# Configure the application
|
||||
RUN cp .env.example .env \
|
||||
&& sed -i "s/^APP_URL=.*/APP_URL=http://127.0.0.1:8443/" .env \
|
||||
&& sed -i "s/^APP_NAME=.*/APP_NAME=PHYRE_PANEL/" .env \
|
||||
&& sed -i "s/^DB_DATABASE=.*/DB_DATABASE=$PANEL_DB_NAME/" .env \
|
||||
&& sed -i "s/^DB_USERNAME=.*/DB_USERNAME=$PANEL_DB_USER/" .env \
|
||||
&& sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=$PANEL_DB_PASSWORD/" .env \
|
||||
&& sed -i "s/^DB_CONNECTION=.*/DB_CONNECTION=mysql/" .env \
|
||||
&& sed -i "s/^MYSQl_ROOT_USERNAME=.*/MYSQl_ROOT_USERNAME=$MYSQL_ROOT_USERNAME/" .env \
|
||||
&& sed -i "s/^MYSQL_ROOT_PASSWORD=.*/MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD/" .env
|
||||
|
||||
# Generate application key and migrate database
|
||||
RUN phyre-php artisan key:generate \
|
||||
&& phyre-php artisan migrate \
|
||||
&& phyre-php artisan db:seed
|
||||
|
||||
# Set permissions for storage and cache directories
|
||||
RUN chmod -R o+w /usr/local/phyre/web/storage/ \
|
||||
&& chmod -R o+w /usr/local/phyre/web/bootstrap/cache/
|
||||
|
||||
# Get current IP address
|
||||
RUN CURRENT_IP=$(curl -s ipinfo.io/ip) \
|
||||
&& echo "PhyrePanel downloaded successfully." \
|
||||
&& echo "Please visit http://$CURRENT_IP:8443 to continue installation of the panel."
|
17
docker/README.Docker.md
Normal file
17
docker/README.Docker.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
### Building and running your application
|
||||
|
||||
When you're ready, start your application by running:
|
||||
`docker compose up --build`.
|
||||
|
||||
### Deploying your application to the cloud
|
||||
|
||||
First, build your image, e.g.: `docker build -t myapp .`.
|
||||
If your cloud uses a different CPU architecture than your development
|
||||
machine (e.g., you are on a Mac M1 and your cloud provider is amd64),
|
||||
you'll want to build the image for that platform, e.g.:
|
||||
`docker build --platform=linux/amd64 -t myapp .`.
|
||||
|
||||
Then, push it to your registry, e.g. `docker push myregistry.com/myapp`.
|
||||
|
||||
Consult Docker's [getting started](https://docs.docker.com/go/get-started-sharing/)
|
||||
docs for more detail on building and pushing.
|
22
docker/compose.yaml
Normal file
22
docker/compose.yaml
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Comments are provided throughout this file to help you get started.
|
||||
# If you need more help, visit the Docker compose reference guide at
|
||||
# https://docs.docker.com/go/compose-spec-reference/
|
||||
|
||||
# Here the instructions define your application as a service called "app".
|
||||
# This service is built from the Dockerfile in the current directory.
|
||||
# You can add other services your application may depend on here, such as a
|
||||
# database or a cache. For examples, see the Awesome Compose repository:
|
||||
# https://github.com/docker/awesome-compose
|
||||
services:
|
||||
app:
|
||||
platform: linux/amd64
|
||||
container_name: phyrepanel
|
||||
build:
|
||||
context: .
|
||||
# If your application exposes a port, uncomment the following lines and change
|
||||
# the port numbers as needed. The first number is the host port and the second
|
||||
# is the port inside the container.
|
||||
ports:
|
||||
- 8080:8080
|
||||
- 8443:8443
|
||||
- 3306:3306
|
147
docker/docker-entrypoint.sh
Normal file
147
docker/docker-entrypoint.sh
Normal file
|
@ -0,0 +1,147 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
service phyre start
|
||||
|
||||
apt-get update && apt-get install -y wget dos2unix
|
||||
|
||||
#
|
||||
#apt-get install libsodium-dev -y
|
||||
#
|
||||
#wget https://raw.githubusercontent.com/CloudVisionApps/PhyrePanel/main/installers/install.sh && chmod +x install.sh && ./install.sh
|
||||
#
|
||||
#ls -la
|
||||
|
||||
#curl http://localhost:8443
|
||||
|
||||
#tail -f /dev/null
|
||||
|
||||
#chmod +x /usr/local/phyre/installers/Ubuntu/22.04/install.sh
|
||||
#dos2unix /usr/local/phyre/installers/Ubuntu/22.04/install.sh
|
||||
|
||||
#bash +x /usr/local/phyre/installers/Ubuntu/22.04/install.sh
|
||||
|
||||
|
||||
|
||||
INSTALL_DIR="/phyre/install"
|
||||
|
||||
apt-get update && apt-get install ca-certificates
|
||||
|
||||
mkdir -p $INSTALL_DIR
|
||||
|
||||
cd $INSTALL_DIR
|
||||
|
||||
DEPENDENCIES_LIST=(
|
||||
"jq"
|
||||
"curl"
|
||||
"wget"
|
||||
"unzip"
|
||||
"zip"
|
||||
"tar"
|
||||
"mysql-common"
|
||||
"mysql-server"
|
||||
"mysql-client"
|
||||
"lsb-release"
|
||||
"gnupg2"
|
||||
"ca-certificates"
|
||||
"apt-transport-https"
|
||||
"software-properties-common"
|
||||
"supervisor"
|
||||
"libonig-dev"
|
||||
"libzip-dev"
|
||||
"libcurl4-openssl-dev"
|
||||
"libssl-dev"
|
||||
"zlib1g-dev"
|
||||
)
|
||||
# Check if the dependencies are installed
|
||||
for DEPENDENCY in "${DEPENDENCIES_LIST[@]}"; do
|
||||
apt install -y $DEPENDENCY
|
||||
done
|
||||
|
||||
# Start MySQL
|
||||
service mysql start
|
||||
|
||||
wget https://raw.githubusercontent.com/CloudVisionApps/PhyrePanel/main/installers/Ubuntu/22.04/greeting.sh
|
||||
mv greeting.sh /etc/profile.d/phyre-greeting.sh
|
||||
|
||||
# Install PHYRE PHP
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelPHPDist/raw/main/debian/php/dist/phyre-php-8.2.0.deb
|
||||
dpkg -i phyre-php-8.2.0.deb
|
||||
|
||||
# Install PHYRE NGINX
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelNginxDist/raw/main/debian/nginx/dist/phyre-nginx-1.24.0.deb
|
||||
dpkg -i phyre-nginx-1.24.0.deb
|
||||
|
||||
service phyre start
|
||||
|
||||
PHYRE_PHP=/usr/local/phyre/php/bin/php
|
||||
|
||||
ln -s $PHYRE_PHP /usr/bin/phyre-php
|
||||
|
||||
|
||||
chmod 711 /home
|
||||
chmod -R 750 /usr/local/phyre
|
||||
|
||||
# Go to web directory
|
||||
cd /usr/local/phyre/web
|
||||
|
||||
# Create MySQL user
|
||||
MYSQL_PHYRE_ROOT_USERNAME="phyre"
|
||||
MYSQL_PHYRE_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE USER '$MYSQL_PHYRE_ROOT_USERNAME'@'%' IDENTIFIED BY '$MYSQL_PHYRE_ROOT_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_PHYRE_ROOT_USERNAME'@'%' WITH GRANT OPTION;
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
|
||||
# Create database
|
||||
PANEL_DB_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
PANEL_DB_NAME="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
PANEL_DB_USER="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE DATABASE $PANEL_DB_NAME;
|
||||
CREATE USER '$PANEL_DB_USER'@'localhost' IDENTIFIED BY '$PANEL_DB_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON $PANEL_DB_NAME.* TO '$PANEL_DB_USER'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
mysql_secure_installation --use-default
|
||||
|
||||
# Change mysql root password
|
||||
MYSQL_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '$MYSQL_ROOT_PASSWORD';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
# Save mysql root password
|
||||
echo "$MYSQL_ROOT_PASSWORD" > /root/.phyre_mysql_root_password
|
||||
|
||||
# Configure the application
|
||||
cp .env.example .env
|
||||
|
||||
sed -i "s/^APP_URL=.*/APP_URL=http://127.0.0.1:8443/" .env
|
||||
sed -i "s/^APP_NAME=.*/APP_NAME=PHYRE_PANEL/" .env
|
||||
sed -i "s/^DB_DATABASE=.*/DB_DATABASE=$PANEL_DB_NAME/" .env
|
||||
sed -i "s/^DB_USERNAME=.*/DB_USERNAME=$PANEL_DB_USER/" .env
|
||||
sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=$PANEL_DB_PASSWORD/" .env
|
||||
sed -i "s/^DB_CONNECTION=.*/DB_CONNECTION=mysql/" .env
|
||||
|
||||
sed -i "s/^MYSQl_ROOT_USERNAME=.*/MYSQl_ROOT_USERNAME=$MYSQL_ROOT_USERNAME/" .env
|
||||
sed -i "s/^MYSQL_ROOT_PASSWORD=.*/MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD/" .env
|
||||
|
||||
phyre-php artisan key:generate
|
||||
phyre-php artisan migrate
|
||||
phyre-php artisan db:seed
|
||||
|
||||
chmod -R o+w /usr/local/phyre/web/storage/
|
||||
chmod -R o+w /usr/local/phyre/web/bootstrap/cache/
|
||||
|
||||
CURRENT_IP=$(curl -s ipinfo.io/ip)
|
||||
|
||||
echo "PhyrePanel downloaded successfully."
|
||||
echo "Please visit http://$CURRENT_IP:8443 to continue installation of the panel."
|
||||
|
76
docker/docker-entrypoint.sh_old
Normal file
76
docker/docker-entrypoint.sh_old
Normal file
|
@ -0,0 +1,76 @@
|
|||
#!/bin/bash
|
||||
|
||||
apt-get update && apt-get install -y wget
|
||||
|
||||
#
|
||||
#apt-get install libsodium-dev -y
|
||||
#
|
||||
#wget https://raw.githubusercontent.com/CloudVisionApps/PhyrePanel/main/installers/install.sh && chmod +x install.sh && ./install.sh
|
||||
#
|
||||
#ls -la
|
||||
|
||||
#curl http://localhost:8443
|
||||
|
||||
#tail -f /dev/null
|
||||
|
||||
cd e2e-tests
|
||||
|
||||
|
||||
apt-get update && \
|
||||
apt-get install --no-install-recommends -y \
|
||||
libgtk2.0-0 \
|
||||
libgtk-3-0 \
|
||||
libnotify-dev \
|
||||
libgconf-2-4 \
|
||||
libgbm-dev \
|
||||
libnss3 \
|
||||
libxss1 \
|
||||
libasound2 \
|
||||
libxtst6 \
|
||||
xauth \
|
||||
xvfb \
|
||||
ttf-wqy-zenhei \
|
||||
ttf-wqy-microhei \
|
||||
xfonts-wqy \
|
||||
fonts-liberation \
|
||||
libgbm1 \
|
||||
libu2f-udev \
|
||||
libvulkan1
|
||||
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
|
||||
|
||||
add-apt-repository ppa:webupd8team/y-ppa-manager
|
||||
apt-get update
|
||||
apt-get install y-ppa-manager
|
||||
|
||||
# Get Chrome
|
||||
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add -
|
||||
sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
|
||||
apt-get update
|
||||
apt-get install -y google-chrome-stable
|
||||
|
||||
/usr/bin/google-chrome
|
||||
|
||||
apt install -y curl
|
||||
|
||||
wget https://deb.nodesource.com/setup_20.x
|
||||
mv setup_20.x /tmp/nodesource_setup.sh
|
||||
bash /tmp/nodesource_setup.sh
|
||||
|
||||
apt --fix-broken install -y
|
||||
|
||||
apt install nodejs -y
|
||||
apt install npm -y
|
||||
|
||||
npm install -g npm@latest --force
|
||||
npm --version
|
||||
|
||||
npm install -g yarn@latest --force
|
||||
yarn --version
|
||||
|
||||
npm install
|
||||
npm run test
|
||||
|
||||
|
9
docker/e2e-tests/cypress.config.js
Normal file
9
docker/e2e-tests/cypress.config.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
const { defineConfig } = require("cypress");
|
||||
|
||||
module.exports = defineConfig({
|
||||
e2e: {
|
||||
setupNodeEvents(on, config) {
|
||||
// implement node event listeners here
|
||||
},
|
||||
},
|
||||
});
|
7
docker/e2e-tests/cypress/e2e/spec.cy.js
Normal file
7
docker/e2e-tests/cypress/e2e/spec.cy.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
describe('Try to access admin panel', () => {
|
||||
|
||||
it('Go to admin panel', () => {
|
||||
cy.visit('http://localhost:8443')
|
||||
})
|
||||
|
||||
})
|
5
docker/e2e-tests/cypress/fixtures/example.json
Normal file
5
docker/e2e-tests/cypress/fixtures/example.json
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"name": "Using fixtures to represent data",
|
||||
"email": "hello@cypress.io",
|
||||
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||
}
|
25
docker/e2e-tests/cypress/support/commands.js
Normal file
25
docker/e2e-tests/cypress/support/commands.js
Normal file
|
@ -0,0 +1,25 @@
|
|||
// ***********************************************
|
||||
// This example commands.js shows you how to
|
||||
// create various custom commands and overwrite
|
||||
// existing commands.
|
||||
//
|
||||
// For more comprehensive examples of custom
|
||||
// commands please read more here:
|
||||
// https://on.cypress.io/custom-commands
|
||||
// ***********************************************
|
||||
//
|
||||
//
|
||||
// -- This is a parent command --
|
||||
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a child command --
|
||||
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a dual command --
|
||||
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
20
docker/e2e-tests/cypress/support/e2e.js
Normal file
20
docker/e2e-tests/cypress/support/e2e.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
// ***********************************************************
|
||||
// This example support/e2e.js is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands'
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
14
docker/e2e-tests/package.json
Normal file
14
docker/e2e-tests/package.json
Normal file
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"name": "e2e-tests",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "cypress.config.js",
|
||||
"scripts": {
|
||||
"test": "cypress run"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"cypress": "^13.7.3"
|
||||
}
|
||||
}
|
26
docker/reinstall.sh
Executable file
26
docker/reinstall.sh
Executable file
|
@ -0,0 +1,26 @@
|
|||
# stop all containers
|
||||
docker stop $(docker ps -aq)
|
||||
|
||||
# remove all containers
|
||||
docker rm -f $(docker ps -aq)
|
||||
|
||||
#remove all images
|
||||
docker image rm $(docker images -q)
|
||||
|
||||
#remove all unused containers, networks, images, and volumes
|
||||
docker system prune -f
|
||||
|
||||
#remove all unused volumes
|
||||
docker volume prune -f
|
||||
|
||||
#remove all unused networks
|
||||
docker network prune -f
|
||||
|
||||
#remove all builds
|
||||
docker builder prune -f
|
||||
|
||||
#remove all completed builds
|
||||
docker builder prune -a -f
|
||||
|
||||
# install new
|
||||
docker compose up -d
|
3
docker/update.sh
Executable file
3
docker/update.sh
Executable file
|
@ -0,0 +1,3 @@
|
|||
docker compose down
|
||||
docker compose up -d
|
||||
docker update --restart unless-stopped $(docker ps -q)
|
13
installers/Ubuntu/22.04/greeting.sh
Normal file
13
installers/Ubuntu/22.04/greeting.sh
Normal file
|
@ -0,0 +1,13 @@
|
|||
CURRENT_IP=$(curl -s ipinfo.io/ip)
|
||||
|
||||
echo " \
|
||||
____ _ ___ ______ _____ ____ _ _ _ _____ _
|
||||
| _ \| | | \ \ / / _ \| ____| | _ \ / \ | \ | | ____| |
|
||||
| |_) | |_| |\ V /| |_) | _| | |_) / _ \ | \| | _| | |
|
||||
| __/| _ | | | | _ <| |___ | __/ ___ \| |\ | |___| |___
|
||||
|_| |_| |_| |_| |_| \_\_____| |_| /_/ \_\_| \_|_____|_____
|
||||
WELCOME TO PHYRE PANEL!
|
||||
You can login at: http://$CURRENT_IP:8443
|
||||
"
|
||||
|
||||
# File can be saved at: /etc/profile.d/greeting.sh
|
127
installers/Ubuntu/22.04/install.sh
Normal file
127
installers/Ubuntu/22.04/install.sh
Normal file
|
@ -0,0 +1,127 @@
|
|||
#!/bin/bash
|
||||
INSTALL_DIR="/phyre/install"
|
||||
|
||||
apt-get update && apt-get install ca-certificates
|
||||
|
||||
mkdir -p $INSTALL_DIR
|
||||
|
||||
cd $INSTALL_DIR
|
||||
|
||||
DEPENDENCIES_LIST=(
|
||||
"jq"
|
||||
"curl"
|
||||
"wget"
|
||||
"unzip"
|
||||
"zip"
|
||||
"tar"
|
||||
"mysql-common"
|
||||
"mysql-server"
|
||||
"mysql-client"
|
||||
"lsb-release"
|
||||
"gnupg2"
|
||||
"ca-certificates"
|
||||
"apt-transport-https"
|
||||
"software-properties-common"
|
||||
"supervisor"
|
||||
"libonig-dev"
|
||||
"libzip-dev"
|
||||
"libcurl4-openssl-dev"
|
||||
"libsodium23"
|
||||
"libpq5"
|
||||
"libssl-dev"
|
||||
"zlib1g-dev"
|
||||
)
|
||||
# Check if the dependencies are installed
|
||||
for DEPENDENCY in "${DEPENDENCIES_LIST[@]}"; do
|
||||
apt install -y $DEPENDENCY
|
||||
done
|
||||
|
||||
# Start MySQL
|
||||
service mysql start
|
||||
|
||||
wget https://raw.githubusercontent.com/CloudVisionApps/PhyrePanel/main/installers/Ubuntu/22.04/greeting.sh
|
||||
mv greeting.sh /etc/profile.d/phyre-greeting.sh
|
||||
|
||||
# Install PHYRE PHP
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelPHPDist/raw/main/debian/php/dist/phyre-php-8.2.0.deb
|
||||
dpkg -i phyre-php-8.2.0.deb
|
||||
|
||||
# Install PHYRE NGINX
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelNginxDist/raw/main/debian/nginx/dist/phyre-nginx-1.24.0.deb
|
||||
dpkg -i phyre-nginx-1.24.0.deb
|
||||
|
||||
service phyre start
|
||||
|
||||
PHYRE_PHP=/usr/local/phyre/php/bin/php
|
||||
|
||||
ln -s $PHYRE_PHP /usr/bin/phyre-php
|
||||
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelWebDist/raw/main/phyre-web-panel.zip
|
||||
unzip -qq -o phyre-web-panel.zip -d /usr/local/phyre/web
|
||||
rm -rf phyre-web-panel.zip
|
||||
|
||||
chmod 711 /home
|
||||
chmod -R 750 /usr/local/phyre
|
||||
|
||||
# Go to web directory
|
||||
cd /usr/local/phyre/web
|
||||
|
||||
# Create MySQL user
|
||||
MYSQL_PHYRE_ROOT_USERNAME="phyre"
|
||||
MYSQL_PHYRE_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE USER '$MYSQL_PHYRE_ROOT_USERNAME'@'%' IDENTIFIED BY '$MYSQL_PHYRE_ROOT_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_PHYRE_ROOT_USERNAME'@'%' WITH GRANT OPTION;
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
|
||||
# Create database
|
||||
PANEL_DB_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
PANEL_DB_NAME="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
PANEL_DB_USER="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE DATABASE $PANEL_DB_NAME;
|
||||
CREATE USER '$PANEL_DB_USER'@'localhost' IDENTIFIED BY '$PANEL_DB_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON $PANEL_DB_NAME.* TO '$PANEL_DB_USER'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
mysql_secure_installation --use-default
|
||||
|
||||
# Change mysql root password
|
||||
MYSQL_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '$MYSQL_ROOT_PASSWORD';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
# Save mysql root password
|
||||
echo "$MYSQL_ROOT_PASSWORD" > /root/.phyre_mysql_root_password
|
||||
|
||||
# Configure the application
|
||||
cp .env.example .env
|
||||
|
||||
sed -i "s/^APP_URL=.*/APP_URL=http://127.0.0.1:8443/" .env
|
||||
sed -i "s/^APP_NAME=.*/APP_NAME=PHYRE_PANEL/" .env
|
||||
sed -i "s/^DB_DATABASE=.*/DB_DATABASE=$PANEL_DB_NAME/" .env
|
||||
sed -i "s/^DB_USERNAME=.*/DB_USERNAME=$PANEL_DB_USER/" .env
|
||||
sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=$PANEL_DB_PASSWORD/" .env
|
||||
sed -i "s/^DB_CONNECTION=.*/DB_CONNECTION=mysql/" .env
|
||||
|
||||
sed -i "s/^MYSQl_ROOT_USERNAME=.*/MYSQl_ROOT_USERNAME=$MYSQL_ROOT_USERNAME/" .env
|
||||
sed -i "s/^MYSQL_ROOT_PASSWORD=.*/MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD/" .env
|
||||
|
||||
phyre-php artisan key:generate
|
||||
phyre-php artisan migrate
|
||||
phyre-php artisan db:seed
|
||||
|
||||
chmod -R o+w /usr/local/phyre/web/storage/
|
||||
chmod -R o+w /usr/local/phyre/web/bootstrap/cache/
|
||||
|
||||
CURRENT_IP=$(curl -s ipinfo.io/ip)
|
||||
|
||||
echo "PhyrePanel downloaded successfully."
|
||||
echo "Please visit http://$CURRENT_IP:8443 to continue installation of the panel."
|
210
installers/Ubuntu/22.04/slow_install.sh
Normal file
210
installers/Ubuntu/22.04/slow_install.sh
Normal file
|
@ -0,0 +1,210 @@
|
|||
#!/bin/bash
|
||||
MAIN_DIR="/phyre/raw-repo"
|
||||
|
||||
apt-get update && apt-get install ca-certificates
|
||||
|
||||
apt install -y git
|
||||
cd /
|
||||
mkdir -p $MAIN_DIR
|
||||
git clone https://github.com/CloudVisionApps/PhyrePanel.git $MAIN_DIR
|
||||
|
||||
HELPERS_DIR=$MAIN_DIR"/shell/helpers/ubuntu"
|
||||
. $HELPERS_DIR"/common.sh"
|
||||
. $HELPERS_DIR"/create-mysql-db-and-user.sh"
|
||||
|
||||
|
||||
# Create the new phyreweb user
|
||||
|
||||
random_password="$(openssl rand -base64 32)"
|
||||
email="admin@phyrepanel.com"
|
||||
|
||||
# Create the new phyreweb user
|
||||
/usr/sbin/useradd "phyreweb" -c "$email" --no-create-home
|
||||
|
||||
# Add the phyreweb user to the www-data group
|
||||
sudo usermod -a -G www-data phyreweb
|
||||
|
||||
# Add the root user to the www-data group
|
||||
#sudo usermod -a -G www-data root
|
||||
|
||||
|
||||
# do not allow login into phyreweb user
|
||||
echo phyreweb:$random_password | sudo chpasswd -e
|
||||
|
||||
mkdir -p /etc/sudoers.d
|
||||
cp -f $MAIN_DIR/installers/Ubuntu/22.04/sudo/phyreweb /etc/sudoers.d/
|
||||
chmod 440 /etc/sudoers.d/phyreweb
|
||||
|
||||
|
||||
# Update the system
|
||||
apt update -y
|
||||
|
||||
REPOSITORIES_LIST=(
|
||||
"ppa:ondrej/php"
|
||||
)
|
||||
|
||||
# Check if the repositories are installed
|
||||
for REPOSITORY in "${REPOSITORIES_LIST[@]}"; do
|
||||
add-apt-repository -y $REPOSITORY
|
||||
done
|
||||
|
||||
DEPENDENCIES_LIST=(
|
||||
"jq"
|
||||
"curl"
|
||||
"wget"
|
||||
"git"
|
||||
"apache2"
|
||||
"apache2-suexec-custom"
|
||||
"nodejs"
|
||||
"npm"
|
||||
"unzip"
|
||||
"zip"
|
||||
"tar"
|
||||
"mysql-common"
|
||||
"mysql-server"
|
||||
"mysql-client"
|
||||
"lsb-release"
|
||||
"gnupg2"
|
||||
"ca-certificates"
|
||||
"apt-transport-https"
|
||||
"software-properties-common"
|
||||
"supervisor"
|
||||
"libonig-dev"
|
||||
"libzip-dev"
|
||||
"libcurl4-openssl-dev"
|
||||
"libssl-dev"
|
||||
"zlib1g-dev"
|
||||
"libapache2-mod-ruid2"
|
||||
# "libapache2-mod-fcgid"
|
||||
# "libapache2-mod-php8.1"
|
||||
"libapache2-mod-php8.2"
|
||||
# "libapache2-mod-php8.3"
|
||||
# "php7.4"
|
||||
# "php7.4-fpm"
|
||||
# "php7.4-{bcmath,xml,bz2,intl,curl,dom,fileinfo,gd,intl,mbstring,mysql,opcache,sqlite3,xmlrpc,zip}"
|
||||
# "php8.1"
|
||||
# "php8.1-fpm"
|
||||
# "php8.1-{bcmath,xml,bz2,intl,curl,dom,fileinfo,gd,intl,mbstring,mysql,opcache,sqlite3,xmlrpc,zip}"
|
||||
"php8.2"
|
||||
"php8.2-fpm"
|
||||
"php8.2-{bcmath,xml,bz2,intl,curl,dom,fileinfo,gd,intl,mbstring,mysql,opcache,sqlite3,xmlrpc,zip}"
|
||||
# "php8.3"
|
||||
# "php8.3-fpm"
|
||||
# "php8.3-{bcmath,xml,bz2,intl,curl,dom,fileinfo,gd,intl,mbstring,mysql,opcache,sqlite3,xmlrpc,zip}"
|
||||
)
|
||||
# Check if the dependencies are installed
|
||||
for DEPENDENCY in "${DEPENDENCIES_LIST[@]}"; do
|
||||
if ! command_is_installed $DEPENDENCY; then
|
||||
echo "Dependency $DEPENDENCY is not installed."
|
||||
echo "Installing $DEPENDENCY..."
|
||||
apt install -y $DEPENDENCY
|
||||
else
|
||||
echo "Dependency $DEPENDENCY is installed."
|
||||
fi
|
||||
done
|
||||
|
||||
sudo a2enmod php8.2
|
||||
sudo a2enmod rewrite
|
||||
sudo a2enmod env
|
||||
sudo a2enmod ssl
|
||||
sudo a2enmod actions
|
||||
sudo a2enmod headers
|
||||
sudo a2enmod suexec
|
||||
sudo a2enmod ruid2
|
||||
sudo a2enmod proxy
|
||||
sudo a2enmod proxy_http
|
||||
sudo a2enconf ssl-params
|
||||
|
||||
#sudo a2enmod fcgid
|
||||
#sudo a2enmod alias
|
||||
#sudo a2enmod proxy_fcgi
|
||||
#sudo a2enmod setenvif
|
||||
|
||||
sudo ufw allow in "Apache Full"
|
||||
|
||||
#sudo a2ensite default-ssl
|
||||
#sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
|
||||
|
||||
systemctl restart apache2
|
||||
|
||||
#DEPENDENCIES_FOR_REMOVE_LIST=(
|
||||
# "apache2"
|
||||
#)
|
||||
## Check if the dependencies are installed
|
||||
#for DEPENDENCY in "${DEPENDENCIES_FOR_REMOVE_LIST[@]}"; do
|
||||
# if command_is_installed $DEPENDENCY; then
|
||||
# echo "Dependency $DEPENDENCY is installed."
|
||||
# echo "Removing $DEPENDENCY..."
|
||||
# apt purge -y $DEPENDENCY
|
||||
# apt autoremove -y
|
||||
# fi
|
||||
#done
|
||||
|
||||
# Install PHYRE PHP
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelPHPDist/raw/main/debian/php/dist/phyre-php-8.2.0.deb
|
||||
sudo dpkg -i phyre-php-8.2.0.deb
|
||||
|
||||
# Install PHYRE NGINX
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelNginxDist/raw/main/debian/nginx/dist/phyre-nginx-1.24.0.deb
|
||||
sudo dpkg -i phyre-nginx-1.24.0.deb
|
||||
|
||||
# sudo ufw allow proto tcp from any to any port 80,443
|
||||
|
||||
# Run Nginx
|
||||
#systemctl start nginx
|
||||
#systemctl enable nginx
|
||||
|
||||
service phyre start
|
||||
|
||||
# Change NGINX index.html
|
||||
rm -rf /var/www/html/*
|
||||
cp $MAIN_DIR/samples/sample-index.html /var/www/html/index.html
|
||||
|
||||
# Restart NGINX
|
||||
#systemctl restart nginx
|
||||
|
||||
PHYRE_PHP=/usr/local/phyre/php/bin/php
|
||||
|
||||
mkdir -p /usr/local/phyre/web
|
||||
cp -r $MAIN_DIR/web/* /usr/local/phyre/web
|
||||
cp $MAIN_DIR/web/.env.example /usr/local/phyre/web/.env.example
|
||||
|
||||
mkdir -p /usr/local/phyre/bin
|
||||
cp -r $MAIN_DIR/bin/* /usr/local/phyre/bin
|
||||
cp -r $MAIN_DIR/samples/* /usr/local/phyre/samples
|
||||
|
||||
mkdir -p /usr/local/phyre/update
|
||||
cp -r $MAIN_DIR/update/* /usr/local/phyre/update
|
||||
chmod +x /usr/local/phyre/update/*
|
||||
|
||||
# Install Composer
|
||||
cd /usr/local/phyre/web
|
||||
|
||||
$PHYRE_PHP -v
|
||||
$PHYRE_PHP -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
||||
$PHYRE_PHP ./composer-setup.php
|
||||
$PHYRE_PHP -r "unlink('composer-setup.php');"
|
||||
|
||||
COMPOSER_ALLOW_SUPERUSER=1 $PHYRE_PHP ./composer.phar install --no-interaction
|
||||
|
||||
# Create database
|
||||
PANEL_DB_NAME="phyredb"
|
||||
PANEL_DB_USER="phyreuser"
|
||||
PANEL_DB_PASSWORD="phyrepass"
|
||||
create_mysql_db_and_user $PANEL_DB_NAME $PANEL_DB_USER $PANEL_DB_PASSWORD
|
||||
|
||||
# Configure the application
|
||||
cp .env.example .env
|
||||
|
||||
sed -i "s/^APP_NAME=.*/APP_NAME=PhyrePanel/" .env
|
||||
sed -i "s/^DB_DATABASE=.*/DB_DATABASE=$PANEL_DB_NAME/" .env
|
||||
sed -i "s/^DB_USERNAME=.*/DB_USERNAME=$PANEL_DB_USER/" .env
|
||||
sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=$PANEL_DB_PASSWORD/" .env
|
||||
sed -i "s/^DB_CONNECTION=.*/DB_CONNECTION=mysql/" .env
|
||||
|
||||
$PHYRE_PHP artisan key:generate
|
||||
$PHYRE_PHP artisan migrate
|
||||
$PHYRE_PHP artisan db:seed
|
||||
|
||||
sudo chmod -R o+w /usr/local/phyre/web/storage/
|
||||
sudo chmod -R o+w /usr/local/phyre/web/bootstrap/cache/
|
6
installers/Ubuntu/22.04/sudo/phyreweb
Normal file
6
installers/Ubuntu/22.04/sudo/phyreweb
Normal file
|
@ -0,0 +1,6 @@
|
|||
Defaults:root !requiretty
|
||||
|
||||
# sudo is limited to PhyrePanel scripts
|
||||
# phyreweb ALL=NOPASSWD:/usr/local/phyre/bin/*
|
||||
|
||||
phyreweb ALL=(ALL) NOPASSWD: ALL
|
24
installers/compile-installers.sh
Executable file
24
installers/compile-installers.sh
Executable file
|
@ -0,0 +1,24 @@
|
|||
# Compile ubuntu-20.04 installers
|
||||
|
||||
# get content from file
|
||||
INSTALL_BASE=$(cat ubuntu-20.04/install-partial/install_base.sh)
|
||||
DOWNLOAD_WEB=$(cat ubuntu-20.04/install-partial/download_web.sh)
|
||||
INSTALL_WEB=$(cat ubuntu-20.04/install-partial/install_web.sh)
|
||||
|
||||
# create installer
|
||||
echo "$INSTALL_BASE" >> ubuntu-20.04/install.sh
|
||||
echo "$DOWNLOAD_WEB" >> ubuntu-20.04/install.sh
|
||||
echo "$INSTALL_WEB" >> ubuntu-20.04/install.sh
|
||||
|
||||
|
||||
# Compile ubuntu-22.04 installers
|
||||
|
||||
# get content from file
|
||||
INSTALL_BASE=$(cat ubuntu-22.04/install-partial/install_base.sh)
|
||||
DOWNLOAD_WEB=$(cat ubuntu-22.04/install-partial/download_web.sh)
|
||||
INSTALL_WEB=$(cat ubuntu-22.04/install-partial/install_web.sh)
|
||||
|
||||
# create installer
|
||||
echo "$INSTALL_BASE" >> ubuntu-22.04/install.sh
|
||||
echo "$DOWNLOAD_WEB" >> ubuntu-22.04/install.sh
|
||||
echo "$INSTALL_WEB" >> ubuntu-22.04/install.sh
|
60
installers/install.sh
Normal file
60
installers/install.sh
Normal file
|
@ -0,0 +1,60 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Check if the user is root
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "This script must be run as root. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if the user is running a 64-bit system
|
||||
if [[ $(uname -m) != "x86_64" ]]; then
|
||||
echo "This script must be run on a 64-bit system. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if the user is running a supported shell
|
||||
if [[ $(echo $SHELL) != "/bin/bash" ]]; then
|
||||
echo "This script must be run on a system running Bash. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if the user is running a supported OS
|
||||
if [[ $(uname -s) != "Linux" ]]; then
|
||||
echo "This script must be run on a Linux system. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if the user is running a supported distro
|
||||
if [[ $(cat /etc/os-release | grep -w "ID_LIKE" | cut -d "=" -f 2) != "debian" ]]; then
|
||||
echo "This script must be run on a Debian-based system. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if the user is running a supported distro version
|
||||
DISTRO_VERSION=$(cat /etc/os-release | grep -w "VERSION_ID" | cut -d "=" -f 2)
|
||||
DISTRO_VERSION=${DISTRO_VERSION//\"/} # Remove quotes from version string
|
||||
|
||||
DISTRO_NAME=$(cat /etc/os-release | grep -w "NAME" | cut -d "=" -f 2)
|
||||
DISTRO_NAME=${DISTRO_NAME//\"/} # Remove quotes from name string
|
||||
# Lowercase the distro name
|
||||
DISTRO_NAME=$(echo $DISTRO_NAME | tr '[:upper:]' '[:lower:]')
|
||||
|
||||
INSTALLER_URL="https://raw.githubusercontent.com/CloudVisionApps/PhyrePanel/main/installers/${DISTRO_NAME}-${DISTRO_VERSION}/install.sh"
|
||||
|
||||
INSTALLER_CONTENT=$(wget ${INSTALLER_URL} 2>&1)
|
||||
if [[ "$INSTALLER_CONTENT" =~ 404\ Not\ Found ]]; then
|
||||
echo "PhyrePanel not supporting this version of distribution"
|
||||
echo "Distro: ${DISTRO_NAME} Version: ${DISTRO_VERSION}"
|
||||
echo "Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check is PHYRE is already installed
|
||||
if [ -d "/usr/local/phyre" ]; then
|
||||
echo "PhyrePanel is already installed. Exiting..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
wget $INSTALLER_URL -O ./phyre-installer.sh
|
||||
chmod +x ./phyre-installer.sh
|
||||
bash ./phyre-installer.sh
|
14
installers/ubuntu-20.04/greeting.sh
Normal file
14
installers/ubuntu-20.04/greeting.sh
Normal file
|
@ -0,0 +1,14 @@
|
|||
CURRENT_IP=$(curl -s ipinfo.io/ip)
|
||||
|
||||
echo " \
|
||||
____ _ ___ ______ _____ ____ _ _ _ _____ _
|
||||
| _ \| | | \ \ / / _ \| ____| | _ \ / \ | \ | | ____| |
|
||||
| |_) | |_| |\ V /| |_) | _| | |_) / _ \ | \| | _| | |
|
||||
| __/| _ | | | | _ <| |___ | __/ ___ \| |\ | |___| |___
|
||||
|_| |_| |_| |_| |_| \_\_____| |_| /_/ \_\_| \_|_____|_____
|
||||
WELCOME TO PHYRE PANEL!
|
||||
OS: Ubuntu 20.04
|
||||
You can login at: http://$CURRENT_IP:8443
|
||||
"
|
||||
|
||||
# File can be saved at: /etc/profile.d/greeting.sh
|
8
installers/ubuntu-20.04/install-partial/download_web.sh
Normal file
8
installers/ubuntu-20.04/install-partial/download_web.sh
Normal file
|
@ -0,0 +1,8 @@
|
|||
#!/bin/bash
|
||||
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelWebDist/raw/main/phyre-web-panel.zip
|
||||
unzip -qq -o phyre-web-panel.zip -d /usr/local/phyre/web
|
||||
rm -rf phyre-web-panel.zip
|
||||
|
||||
chmod 711 /home
|
||||
chmod -R 750 /usr/local/phyre
|
59
installers/ubuntu-20.04/install-partial/install_base.sh
Normal file
59
installers/ubuntu-20.04/install-partial/install_base.sh
Normal file
|
@ -0,0 +1,59 @@
|
|||
#!/bin/bash
|
||||
INSTALL_DIR="/phyre/install"
|
||||
|
||||
apt-get update && apt-get install ca-certificates
|
||||
apt-get upgrade -y
|
||||
|
||||
mkdir -p $INSTALL_DIR
|
||||
|
||||
cd $INSTALL_DIR
|
||||
|
||||
DEPENDENCIES_LIST=(
|
||||
"openssl"
|
||||
"jq"
|
||||
"curl"
|
||||
"wget"
|
||||
"unzip"
|
||||
"zip"
|
||||
"tar"
|
||||
"mysql-common"
|
||||
"mysql-server"
|
||||
"mysql-client"
|
||||
"lsb-release"
|
||||
"gnupg2"
|
||||
"ca-certificates"
|
||||
"apt-transport-https"
|
||||
"software-properties-common"
|
||||
"supervisor"
|
||||
"libonig-dev"
|
||||
"libzip-dev"
|
||||
"libcurl4-openssl-dev"
|
||||
"libsodium23"
|
||||
"libpq5"
|
||||
"libssl-dev"
|
||||
"zlib1g-dev"
|
||||
)
|
||||
# Check if the dependencies are installed
|
||||
for DEPENDENCY in "${DEPENDENCIES_LIST[@]}"; do
|
||||
apt install -y $DEPENDENCY
|
||||
done
|
||||
|
||||
# Start MySQL
|
||||
service mysql start
|
||||
|
||||
wget https://raw.githubusercontent.com/CloudVisionApps/PhyrePanel/main/installers/ubuntu-20.04/greeting.sh
|
||||
mv greeting.sh /etc/profile.d/phyre-greeting.sh
|
||||
|
||||
# Install PHYRE PHP
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelPHP/raw/main/compilators/debian/php/dist/phyre-php-8.2.0-ubuntu-20.04.deb
|
||||
dpkg -i phyre-php-8.2.0-ubuntu-20.04.deb
|
||||
|
||||
# Install PHYRE NGINX
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelNGINX/raw/main/compilators/debian/nginx/dist/phyre-nginx-1.24.0-ubuntu-20.04.deb
|
||||
dpkg -i phyre-nginx-1.24.0-ubuntu-20.04.deb
|
||||
|
||||
service phyre start
|
||||
|
||||
PHYRE_PHP=/usr/local/phyre/php/bin/php
|
||||
|
||||
ln -s $PHYRE_PHP /usr/bin/phyre-php
|
70
installers/ubuntu-20.04/install-partial/install_web.sh
Normal file
70
installers/ubuntu-20.04/install-partial/install_web.sh
Normal file
|
@ -0,0 +1,70 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Check dir exists
|
||||
if [ ! -d "/usr/local/phyre/web" ]; then
|
||||
echo "PhyrePanel directory not found."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Go to web directory
|
||||
cd /usr/local/phyre/web
|
||||
|
||||
# Create MySQL user
|
||||
MYSQL_PHYRE_ROOT_USERNAME="phyre"
|
||||
MYSQL_PHYRE_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE USER '$MYSQL_PHYRE_ROOT_USERNAME'@'%' IDENTIFIED BY '$MYSQL_PHYRE_ROOT_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_PHYRE_ROOT_USERNAME'@'%' WITH GRANT OPTION;
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
|
||||
# Create database
|
||||
PANEL_DB_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
PANEL_DB_NAME="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
PANEL_DB_USER="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE DATABASE $PANEL_DB_NAME;
|
||||
CREATE USER '$PANEL_DB_USER'@'localhost' IDENTIFIED BY '$PANEL_DB_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON $PANEL_DB_NAME.* TO '$PANEL_DB_USER'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
mysql_secure_installation --use-default
|
||||
|
||||
# Change mysql root password
|
||||
MYSQL_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '$MYSQL_ROOT_PASSWORD';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
# Save mysql root password
|
||||
echo "$MYSQL_ROOT_PASSWORD" > /root/.phyre_mysql_root_password
|
||||
|
||||
# Configure the application
|
||||
cp .env.example .env
|
||||
|
||||
sed -i "s/^APP_URL=.*/APP_URL=127.0.0.1:8443" .env
|
||||
sed -i "s/^APP_NAME=.*/APP_NAME=PHYRE_PANEL/" .env
|
||||
sed -i "s/^DB_DATABASE=.*/DB_DATABASE=$PANEL_DB_NAME/" .env
|
||||
sed -i "s/^DB_USERNAME=.*/DB_USERNAME=$PANEL_DB_USER/" .env
|
||||
sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=$PANEL_DB_PASSWORD/" .env
|
||||
sed -i "s/^DB_CONNECTION=.*/DB_CONNECTION=mysql/" .env
|
||||
|
||||
sed -i "s/^MYSQl_ROOT_USERNAME=.*/MYSQl_ROOT_USERNAME=$MYSQL_ROOT_USERNAME/" .env
|
||||
sed -i "s/^MYSQL_ROOT_PASSWORD=.*/MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD/" .env
|
||||
|
||||
phyre-php artisan key:generate
|
||||
phyre-php artisan migrate
|
||||
phyre-php artisan db:seed
|
||||
|
||||
chmod -R o+w /usr/local/phyre/web/storage/
|
||||
chmod -R o+w /usr/local/phyre/web/bootstrap/cache/
|
||||
|
||||
CURRENT_IP=$(curl -s ipinfo.io/ip)
|
||||
|
||||
echo "PhyrePanel downloaded successfully."
|
||||
echo "Please visit http://$CURRENT_IP:8443 to continue installation of the panel."
|
137
installers/ubuntu-20.04/install.sh
Normal file
137
installers/ubuntu-20.04/install.sh
Normal file
|
@ -0,0 +1,137 @@
|
|||
#!/bin/bash
|
||||
INSTALL_DIR="/phyre/install"
|
||||
|
||||
apt-get update && apt-get install ca-certificates
|
||||
apt-get upgrade -y
|
||||
|
||||
mkdir -p $INSTALL_DIR
|
||||
|
||||
cd $INSTALL_DIR
|
||||
|
||||
DEPENDENCIES_LIST=(
|
||||
"openssl"
|
||||
"jq"
|
||||
"curl"
|
||||
"wget"
|
||||
"unzip"
|
||||
"zip"
|
||||
"tar"
|
||||
"mysql-common"
|
||||
"mysql-server"
|
||||
"mysql-client"
|
||||
"lsb-release"
|
||||
"gnupg2"
|
||||
"ca-certificates"
|
||||
"apt-transport-https"
|
||||
"software-properties-common"
|
||||
"supervisor"
|
||||
"libonig-dev"
|
||||
"libzip-dev"
|
||||
"libcurl4-openssl-dev"
|
||||
"libsodium23"
|
||||
"libpq5"
|
||||
"libssl-dev"
|
||||
"zlib1g-dev"
|
||||
)
|
||||
# Check if the dependencies are installed
|
||||
for DEPENDENCY in "${DEPENDENCIES_LIST[@]}"; do
|
||||
apt install -y $DEPENDENCY
|
||||
done
|
||||
|
||||
# Start MySQL
|
||||
service mysql start
|
||||
|
||||
wget https://raw.githubusercontent.com/CloudVisionApps/PhyrePanel/main/installers/ubuntu-20.04/greeting.sh
|
||||
mv greeting.sh /etc/profile.d/phyre-greeting.sh
|
||||
|
||||
# Install PHYRE PHP
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelPHP/raw/main/compilators/debian/php/dist/phyre-php-8.2.0-ubuntu-20.04.deb
|
||||
dpkg -i phyre-php-8.2.0-ubuntu-20.04.deb
|
||||
|
||||
# Install PHYRE NGINX
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelNGINX/raw/main/compilators/debian/nginx/dist/phyre-nginx-1.24.0-ubuntu-20.04.deb
|
||||
dpkg -i phyre-nginx-1.24.0-ubuntu-20.04.deb
|
||||
|
||||
service phyre start
|
||||
|
||||
PHYRE_PHP=/usr/local/phyre/php/bin/php
|
||||
|
||||
ln -s $PHYRE_PHP /usr/bin/phyre-php
|
||||
#!/bin/bash
|
||||
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelWebDist/raw/main/phyre-web-panel.zip
|
||||
unzip -qq -o phyre-web-panel.zip -d /usr/local/phyre/web
|
||||
rm -rf phyre-web-panel.zip
|
||||
|
||||
chmod 711 /home
|
||||
chmod -R 750 /usr/local/phyre
|
||||
#!/bin/bash
|
||||
|
||||
# Check dir exists
|
||||
if [ ! -d "/usr/local/phyre/web" ]; then
|
||||
echo "PhyrePanel directory not found."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Go to web directory
|
||||
cd /usr/local/phyre/web
|
||||
|
||||
# Create MySQL user
|
||||
MYSQL_PHYRE_ROOT_USERNAME="phyre"
|
||||
MYSQL_PHYRE_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE USER '$MYSQL_PHYRE_ROOT_USERNAME'@'%' IDENTIFIED BY '$MYSQL_PHYRE_ROOT_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_PHYRE_ROOT_USERNAME'@'%' WITH GRANT OPTION;
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
|
||||
# Create database
|
||||
PANEL_DB_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
PANEL_DB_NAME="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
PANEL_DB_USER="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE DATABASE $PANEL_DB_NAME;
|
||||
CREATE USER '$PANEL_DB_USER'@'localhost' IDENTIFIED BY '$PANEL_DB_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON $PANEL_DB_NAME.* TO '$PANEL_DB_USER'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
mysql_secure_installation --use-default
|
||||
|
||||
# Change mysql root password
|
||||
MYSQL_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '$MYSQL_ROOT_PASSWORD';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
# Save mysql root password
|
||||
echo "$MYSQL_ROOT_PASSWORD" > /root/.phyre_mysql_root_password
|
||||
|
||||
# Configure the application
|
||||
cp .env.example .env
|
||||
|
||||
sed -i "s/^APP_URL=.*/APP_URL=127.0.0.1:8443" .env
|
||||
sed -i "s/^APP_NAME=.*/APP_NAME=PHYRE_PANEL/" .env
|
||||
sed -i "s/^DB_DATABASE=.*/DB_DATABASE=$PANEL_DB_NAME/" .env
|
||||
sed -i "s/^DB_USERNAME=.*/DB_USERNAME=$PANEL_DB_USER/" .env
|
||||
sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=$PANEL_DB_PASSWORD/" .env
|
||||
sed -i "s/^DB_CONNECTION=.*/DB_CONNECTION=mysql/" .env
|
||||
|
||||
sed -i "s/^MYSQl_ROOT_USERNAME=.*/MYSQl_ROOT_USERNAME=$MYSQL_ROOT_USERNAME/" .env
|
||||
sed -i "s/^MYSQL_ROOT_PASSWORD=.*/MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD/" .env
|
||||
|
||||
phyre-php artisan key:generate
|
||||
phyre-php artisan migrate
|
||||
phyre-php artisan db:seed
|
||||
|
||||
chmod -R o+w /usr/local/phyre/web/storage/
|
||||
chmod -R o+w /usr/local/phyre/web/bootstrap/cache/
|
||||
|
||||
CURRENT_IP=$(curl -s ipinfo.io/ip)
|
||||
|
||||
echo "PhyrePanel downloaded successfully."
|
||||
echo "Please visit http://$CURRENT_IP:8443 to continue installation of the panel."
|
14
installers/ubuntu-22.04/greeting.sh
Normal file
14
installers/ubuntu-22.04/greeting.sh
Normal file
|
@ -0,0 +1,14 @@
|
|||
CURRENT_IP=$(curl -s ipinfo.io/ip)
|
||||
|
||||
echo " \
|
||||
____ _ ___ ______ _____ ____ _ _ _ _____ _
|
||||
| _ \| | | \ \ / / _ \| ____| | _ \ / \ | \ | | ____| |
|
||||
| |_) | |_| |\ V /| |_) | _| | |_) / _ \ | \| | _| | |
|
||||
| __/| _ | | | | _ <| |___ | __/ ___ \| |\ | |___| |___
|
||||
|_| |_| |_| |_| |_| \_\_____| |_| /_/ \_\_| \_|_____|_____
|
||||
WELCOME TO PHYRE PANEL!
|
||||
OS: Ubuntu 22.04
|
||||
You can login at: http://$CURRENT_IP:8443
|
||||
"
|
||||
|
||||
# File can be saved at: /etc/profile.d/greeting.sh
|
8
installers/ubuntu-22.04/install-partial/download_web.sh
Normal file
8
installers/ubuntu-22.04/install-partial/download_web.sh
Normal file
|
@ -0,0 +1,8 @@
|
|||
#!/bin/bash
|
||||
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelWebDist/raw/main/phyre-web-panel.zip
|
||||
unzip -qq -o phyre-web-panel.zip -d /usr/local/phyre/web
|
||||
rm -rf phyre-web-panel.zip
|
||||
|
||||
chmod 711 /home
|
||||
chmod -R 750 /usr/local/phyre
|
59
installers/ubuntu-22.04/install-partial/install_base.sh
Normal file
59
installers/ubuntu-22.04/install-partial/install_base.sh
Normal file
|
@ -0,0 +1,59 @@
|
|||
#!/bin/bash
|
||||
INSTALL_DIR="/phyre/install"
|
||||
|
||||
apt-get update && apt-get install ca-certificates
|
||||
apt-get upgrade -y
|
||||
|
||||
mkdir -p $INSTALL_DIR
|
||||
|
||||
cd $INSTALL_DIR
|
||||
|
||||
DEPENDENCIES_LIST=(
|
||||
"openssl"
|
||||
"jq"
|
||||
"curl"
|
||||
"wget"
|
||||
"unzip"
|
||||
"zip"
|
||||
"tar"
|
||||
"mysql-common"
|
||||
"mysql-server"
|
||||
"mysql-client"
|
||||
"lsb-release"
|
||||
"gnupg2"
|
||||
"ca-certificates"
|
||||
"apt-transport-https"
|
||||
"software-properties-common"
|
||||
"supervisor"
|
||||
"libonig-dev"
|
||||
"libzip-dev"
|
||||
"libcurl4-openssl-dev"
|
||||
"libsodium23"
|
||||
"libpq5"
|
||||
"libssl-dev"
|
||||
"zlib1g-dev"
|
||||
)
|
||||
# Check if the dependencies are installed
|
||||
for DEPENDENCY in "${DEPENDENCIES_LIST[@]}"; do
|
||||
apt install -y $DEPENDENCY
|
||||
done
|
||||
|
||||
# Start MySQL
|
||||
service mysql start
|
||||
|
||||
wget https://raw.githubusercontent.com/CloudVisionApps/PhyrePanel/main/installers/ubuntu-22.04/greeting.sh
|
||||
mv greeting.sh /etc/profile.d/phyre-greeting.sh
|
||||
|
||||
# Install PHYRE PHP
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelPHP/raw/main/compilators/debian/php/dist/phyre-php-8.2.0-ubuntu-22.04.deb
|
||||
dpkg -i phyre-php-8.2.0-ubuntu-22.04.deb
|
||||
|
||||
# Install PHYRE NGINX
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelNGINX/raw/main/compilators/debian/nginx/dist/phyre-nginx-1.24.0-ubuntu-22.04.deb
|
||||
dpkg -i phyre-nginx-1.24.0-ubuntu-22.04.deb
|
||||
|
||||
service phyre start
|
||||
|
||||
PHYRE_PHP=/usr/local/phyre/php/bin/php
|
||||
|
||||
ln -s $PHYRE_PHP /usr/bin/phyre-php
|
70
installers/ubuntu-22.04/install-partial/install_web.sh
Normal file
70
installers/ubuntu-22.04/install-partial/install_web.sh
Normal file
|
@ -0,0 +1,70 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Check dir exists
|
||||
if [ ! -d "/usr/local/phyre/web" ]; then
|
||||
echo "PhyrePanel directory not found."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Go to web directory
|
||||
cd /usr/local/phyre/web
|
||||
|
||||
# Create MySQL user
|
||||
MYSQL_PHYRE_ROOT_USERNAME="phyre"
|
||||
MYSQL_PHYRE_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE USER '$MYSQL_PHYRE_ROOT_USERNAME'@'%' IDENTIFIED BY '$MYSQL_PHYRE_ROOT_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_PHYRE_ROOT_USERNAME'@'%' WITH GRANT OPTION;
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
|
||||
# Create database
|
||||
PANEL_DB_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
PANEL_DB_NAME="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
PANEL_DB_USER="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE DATABASE $PANEL_DB_NAME;
|
||||
CREATE USER '$PANEL_DB_USER'@'localhost' IDENTIFIED BY '$PANEL_DB_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON $PANEL_DB_NAME.* TO '$PANEL_DB_USER'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
mysql_secure_installation --use-default
|
||||
|
||||
# Change mysql root password
|
||||
MYSQL_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '$MYSQL_ROOT_PASSWORD';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
# Save mysql root password
|
||||
echo "$MYSQL_ROOT_PASSWORD" > /root/.phyre_mysql_root_password
|
||||
|
||||
# Configure the application
|
||||
cp .env.example .env
|
||||
|
||||
sed -i "s/^APP_URL=.*/APP_URL=127.0.0.1:8443" .env
|
||||
sed -i "s/^APP_NAME=.*/APP_NAME=PHYRE_PANEL/" .env
|
||||
sed -i "s/^DB_DATABASE=.*/DB_DATABASE=$PANEL_DB_NAME/" .env
|
||||
sed -i "s/^DB_USERNAME=.*/DB_USERNAME=$PANEL_DB_USER/" .env
|
||||
sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=$PANEL_DB_PASSWORD/" .env
|
||||
sed -i "s/^DB_CONNECTION=.*/DB_CONNECTION=mysql/" .env
|
||||
|
||||
sed -i "s/^MYSQl_ROOT_USERNAME=.*/MYSQl_ROOT_USERNAME=$MYSQL_ROOT_USERNAME/" .env
|
||||
sed -i "s/^MYSQL_ROOT_PASSWORD=.*/MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD/" .env
|
||||
|
||||
phyre-php artisan key:generate
|
||||
phyre-php artisan migrate
|
||||
phyre-php artisan db:seed
|
||||
|
||||
chmod -R o+w /usr/local/phyre/web/storage/
|
||||
chmod -R o+w /usr/local/phyre/web/bootstrap/cache/
|
||||
|
||||
CURRENT_IP=$(curl -s ipinfo.io/ip)
|
||||
|
||||
echo "PhyrePanel downloaded successfully."
|
||||
echo "Please visit http://$CURRENT_IP:8443 to continue installation of the panel."
|
137
installers/ubuntu-22.04/install.sh
Normal file
137
installers/ubuntu-22.04/install.sh
Normal file
|
@ -0,0 +1,137 @@
|
|||
#!/bin/bash
|
||||
INSTALL_DIR="/phyre/install"
|
||||
|
||||
apt-get update && apt-get install ca-certificates
|
||||
apt-get upgrade -y
|
||||
|
||||
mkdir -p $INSTALL_DIR
|
||||
|
||||
cd $INSTALL_DIR
|
||||
|
||||
DEPENDENCIES_LIST=(
|
||||
"openssl"
|
||||
"jq"
|
||||
"curl"
|
||||
"wget"
|
||||
"unzip"
|
||||
"zip"
|
||||
"tar"
|
||||
"mysql-common"
|
||||
"mysql-server"
|
||||
"mysql-client"
|
||||
"lsb-release"
|
||||
"gnupg2"
|
||||
"ca-certificates"
|
||||
"apt-transport-https"
|
||||
"software-properties-common"
|
||||
"supervisor"
|
||||
"libonig-dev"
|
||||
"libzip-dev"
|
||||
"libcurl4-openssl-dev"
|
||||
"libsodium23"
|
||||
"libpq5"
|
||||
"libssl-dev"
|
||||
"zlib1g-dev"
|
||||
)
|
||||
# Check if the dependencies are installed
|
||||
for DEPENDENCY in "${DEPENDENCIES_LIST[@]}"; do
|
||||
apt install -y $DEPENDENCY
|
||||
done
|
||||
|
||||
# Start MySQL
|
||||
service mysql start
|
||||
|
||||
wget https://raw.githubusercontent.com/CloudVisionApps/PhyrePanel/main/installers/ubuntu-22.04/greeting.sh
|
||||
mv greeting.sh /etc/profile.d/phyre-greeting.sh
|
||||
|
||||
# Install PHYRE PHP
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelPHP/raw/main/compilators/debian/php/dist/phyre-php-8.2.0-ubuntu-22.04.deb
|
||||
dpkg -i phyre-php-8.2.0-ubuntu-22.04.deb
|
||||
|
||||
# Install PHYRE NGINX
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelNGINX/raw/main/compilators/debian/nginx/dist/phyre-nginx-1.24.0-ubuntu-22.04.deb
|
||||
dpkg -i phyre-nginx-1.24.0-ubuntu-22.04.deb
|
||||
|
||||
service phyre start
|
||||
|
||||
PHYRE_PHP=/usr/local/phyre/php/bin/php
|
||||
|
||||
ln -s $PHYRE_PHP /usr/bin/phyre-php
|
||||
#!/bin/bash
|
||||
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelWebDist/raw/main/phyre-web-panel.zip
|
||||
unzip -qq -o phyre-web-panel.zip -d /usr/local/phyre/web
|
||||
rm -rf phyre-web-panel.zip
|
||||
|
||||
chmod 711 /home
|
||||
chmod -R 750 /usr/local/phyre
|
||||
#!/bin/bash
|
||||
|
||||
# Check dir exists
|
||||
if [ ! -d "/usr/local/phyre/web" ]; then
|
||||
echo "PhyrePanel directory not found."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Go to web directory
|
||||
cd /usr/local/phyre/web
|
||||
|
||||
# Create MySQL user
|
||||
MYSQL_PHYRE_ROOT_USERNAME="phyre"
|
||||
MYSQL_PHYRE_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE USER '$MYSQL_PHYRE_ROOT_USERNAME'@'%' IDENTIFIED BY '$MYSQL_PHYRE_ROOT_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_PHYRE_ROOT_USERNAME'@'%' WITH GRANT OPTION;
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
|
||||
# Create database
|
||||
PANEL_DB_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
PANEL_DB_NAME="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
PANEL_DB_USER="phyre$(tr -dc a-za-z0-9 </dev/urandom | head -c 13; echo)"
|
||||
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
CREATE DATABASE $PANEL_DB_NAME;
|
||||
CREATE USER '$PANEL_DB_USER'@'localhost' IDENTIFIED BY '$PANEL_DB_PASSWORD';
|
||||
GRANT ALL PRIVILEGES ON $PANEL_DB_NAME.* TO '$PANEL_DB_USER'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
mysql_secure_installation --use-default
|
||||
|
||||
# Change mysql root password
|
||||
MYSQL_ROOT_PASSWORD="$(tr -dc a-za-z0-9 </dev/urandom | head -c 32; echo)"
|
||||
mysql -uroot -proot <<MYSQL_SCRIPT
|
||||
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '$MYSQL_ROOT_PASSWORD';
|
||||
FLUSH PRIVILEGES;
|
||||
MYSQL_SCRIPT
|
||||
|
||||
# Save mysql root password
|
||||
echo "$MYSQL_ROOT_PASSWORD" > /root/.phyre_mysql_root_password
|
||||
|
||||
# Configure the application
|
||||
cp .env.example .env
|
||||
|
||||
sed -i "s/^APP_URL=.*/APP_URL=127.0.0.1:8443" .env
|
||||
sed -i "s/^APP_NAME=.*/APP_NAME=PHYRE_PANEL/" .env
|
||||
sed -i "s/^DB_DATABASE=.*/DB_DATABASE=$PANEL_DB_NAME/" .env
|
||||
sed -i "s/^DB_USERNAME=.*/DB_USERNAME=$PANEL_DB_USER/" .env
|
||||
sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=$PANEL_DB_PASSWORD/" .env
|
||||
sed -i "s/^DB_CONNECTION=.*/DB_CONNECTION=mysql/" .env
|
||||
|
||||
sed -i "s/^MYSQl_ROOT_USERNAME=.*/MYSQl_ROOT_USERNAME=$MYSQL_ROOT_USERNAME/" .env
|
||||
sed -i "s/^MYSQL_ROOT_PASSWORD=.*/MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD/" .env
|
||||
|
||||
phyre-php artisan key:generate
|
||||
phyre-php artisan migrate
|
||||
phyre-php artisan db:seed
|
||||
|
||||
chmod -R o+w /usr/local/phyre/web/storage/
|
||||
chmod -R o+w /usr/local/phyre/web/bootstrap/cache/
|
||||
|
||||
CURRENT_IP=$(curl -s ipinfo.io/ip)
|
||||
|
||||
echo "PhyrePanel downloaded successfully."
|
||||
echo "Please visit http://$CURRENT_IP:8443 to continue installation of the panel."
|
159
samples/sample-index.html
Normal file
159
samples/sample-index.html
Normal file
|
@ -0,0 +1,159 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="flex flex-col bg-gray-50 justify-center h-screen text-center">
|
||||
|
||||
<div>
|
||||
<div class="mb-4">
|
||||
<svg class="w-[26rem] m-auto" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 808.52 192.65">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: url(#linear-gradient-12);
|
||||
}
|
||||
|
||||
.cls-1, .cls-2, .cls-3, .cls-4, .cls-5, .cls-6, .cls-7, .cls-8, .cls-9, .cls-10, .cls-11, .cls-12, .cls-13 {
|
||||
stroke-width: 0px;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
fill: url(#linear-gradient);
|
||||
}
|
||||
|
||||
.cls-3 {
|
||||
fill: url(#linear-gradient-6);
|
||||
}
|
||||
|
||||
.cls-4 {
|
||||
fill: url(#linear-gradient-11);
|
||||
}
|
||||
|
||||
.cls-5 {
|
||||
fill: url(#linear-gradient-5);
|
||||
}
|
||||
|
||||
.cls-6 {
|
||||
fill: #f9be22;
|
||||
}
|
||||
|
||||
.cls-7 {
|
||||
fill: url(#linear-gradient-2);
|
||||
}
|
||||
|
||||
.cls-8 {
|
||||
fill: url(#linear-gradient-7);
|
||||
}
|
||||
|
||||
.cls-9 {
|
||||
fill: url(#linear-gradient-3);
|
||||
}
|
||||
|
||||
.cls-10 {
|
||||
fill: url(#linear-gradient-9);
|
||||
}
|
||||
|
||||
.cls-11 {
|
||||
fill: url(#linear-gradient-8);
|
||||
}
|
||||
|
||||
.cls-12 {
|
||||
fill: url(#linear-gradient-10);
|
||||
}
|
||||
|
||||
.cls-13 {
|
||||
fill: url(#linear-gradient-4);
|
||||
}
|
||||
</style>
|
||||
<linearGradient id="linear-gradient" x1="5.89" y1="67.83" x2="786.82" y2="71" gradientUnits="userSpaceOnUse">
|
||||
<stop offset=".25" stop-color="#f8bd20"/>
|
||||
<stop offset=".41" stop-color="#f9c628"/>
|
||||
<stop offset=".69" stop-color="#fbd131"/>
|
||||
<stop offset="1" stop-color="#fcd535"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-2" x1="694.68" y1="13.95" x2="808.52" y2="13.95" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#f8bd20"/>
|
||||
<stop offset=".63" stop-color="#fcd535"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-3" x1="642.49" y1="69.62" x2="785.47" y2="69.62" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#f8bd20" stop-opacity=".9"/>
|
||||
<stop offset=".15" stop-color="rgba(249, 197, 39, .94)" stop-opacity=".94"/>
|
||||
<stop offset=".37" stop-color="rgba(250, 206, 47, .97)" stop-opacity=".97"/>
|
||||
<stop offset=".63" stop-color="rgba(251, 211, 51, .99)" stop-opacity=".99"/>
|
||||
<stop offset="1" stop-color="#fcd535"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-4" x1="647.99" y1="69.56" x2="785.96" y2="69.56" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#f8bd20"/>
|
||||
<stop offset=".63" stop-color="#fcd535"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-5" x1="161.7" y1="69.56" x2="212.2" y2="69.56" gradientUnits="userSpaceOnUse">
|
||||
<stop offset=".45" stop-color="#f8bd20"/>
|
||||
<stop offset=".54" stop-color="#f9c326"/>
|
||||
<stop offset=".78" stop-color="#fbd031"/>
|
||||
<stop offset="1" stop-color="#fcd535"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-6" x1="-14.8" y1="68.54" x2="812.93" y2="71.9" gradientUnits="userSpaceOnUse">
|
||||
<stop offset=".23" stop-color="#f8bd20"/>
|
||||
<stop offset=".23" stop-color="#f8bd20"/>
|
||||
<stop offset=".4" stop-color="#faca2c"/>
|
||||
<stop offset=".6" stop-color="#fbd232"/>
|
||||
<stop offset="1" stop-color="#fcd535"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-7" x1="19.43" y1="68.42" x2="756.99" y2="71.42" xlink:href="#linear-gradient-6"/>
|
||||
<linearGradient id="linear-gradient-8" x1="-12.06" y1="69.99" x2="808.02" y2="73.32" xlink:href="#linear-gradient-6"/>
|
||||
<linearGradient id="linear-gradient-9" x1="0" y1="69.56" x2="54.12" y2="69.56" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#f8bd20"/>
|
||||
<stop offset=".21" stop-color="#f9c628"/>
|
||||
<stop offset=".58" stop-color="#fbd131"/>
|
||||
<stop offset="1" stop-color="#fcd535"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-10" x1="-24.07" y1="41.56" x2="837.97" y2="45.06" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#f8bd20"/>
|
||||
<stop offset=".07" stop-color="#f9c628"/>
|
||||
<stop offset=".2" stop-color="#fbd131"/>
|
||||
<stop offset=".34" stop-color="#fcd535"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-11" x1="485.03" y1="69.56" x2="538.44" y2="69.56" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#f8bd20"/>
|
||||
<stop offset=".21" stop-color="#f9c628"/>
|
||||
<stop offset=".58" stop-color="#fbd131"/>
|
||||
<stop offset="1" stop-color="#fcd535"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-12" x1="521.21" y1="69.56" x2="642.79" y2="69.56" xlink:href="#linear-gradient-11"/>
|
||||
</defs>
|
||||
<g>
|
||||
<path class="cls-6" d="M383.66,189.79l.87-4.15c.31-1.47-.81-2.86-2.32-2.86h-10.04c-1.12,0-2.08.78-2.32,1.87l-1.31,6.12c-.23,1.09-1.2,1.87-2.32,1.87h0c-1.51,0-2.63-1.39-2.32-2.86l4.22-19.87c.23-1.09,1.2-1.88,2.32-1.88h0c1.51,0,2.63,1.39,2.32,2.86l-.88,4.17c-.31,1.47.81,2.86,2.32,2.86h10.04c1.12,0,2.08-.78,2.32-1.87l1.32-6.14c.23-1.09,1.2-1.87,2.32-1.87h0c1.51,0,2.63,1.39,2.32,2.86l-4.22,19.87c-.23,1.09-1.2,1.88-2.32,1.88h0c-1.51,0-2.63-1.39-2.32-2.86Z"/>
|
||||
<path class="cls-6" d="M416.74,192.65h-11c-1.72,0-3.35-.79-4.41-2.14h0c-1.03-1.31-1.42-3-1.08-4.62l2.37-11.23c.33-1.56,1.18-2.96,2.41-3.97l.86-.7c1.53-1.25,3.45-1.94,5.43-1.94h10.39c1.72,0,3.35.79,4.41,2.14h0c1.03,1.31,1.42,3,1.08,4.62l-2.37,11.19c-.34,1.59-1.2,3.01-2.45,4.04l-1.27,1.04c-1.23,1.01-2.78,1.57-4.38,1.57ZM419.35,172.9h-8.48c-1.77,0-3.3,1.24-3.66,2.97l-1.7,7.97c-.43,2.03,1.12,3.95,3.2,3.95h7.89c1.76,0,3.28-1.23,3.64-2.95l1.83-8.58c.37-1.73-.95-3.35-2.72-3.35Z"/>
|
||||
<path class="cls-6" d="M450.21,192.65h-13.09c-1.44,0-2.52-1.33-2.22-2.74l.07-.32c.22-1.05,1.15-1.8,2.22-1.8h14.24c1.27,0,2.51-.44,3.49-1.25h0c.35-.29.59-.68.69-1.12h0c.14-.6,0-1.22-.38-1.71l-.04-.05c-.43-.55-1.09-.88-1.79-.88h-10.13c-1.67,0-2.95-.63-3.99-1.94h0c-1.07-1.36-1.12-3.12-1.09-4.97l.07-1.88c0-.68.15-1.66.56-2.43.48-.92.95-1.56,2.87-2.8h0c1.32-.83,3.78-.72,6.91-.72h12.75c1.44,0,2.52,1.33,2.22,2.74l-.07.32c-.22,1.05-1.15,1.8-2.22,1.8h-14.3c-1.25,0-2.46.43-3.43,1.22h0c-.36.3-.61.7-.7,1.16h0c-.12.59.02,1.2.39,1.67h0c.48.61,1.21.97,1.99.97h10.37c1.41,0,2.74.64,3.61,1.75h0c1.23,1.56,1.71,3.59,1.29,5.53l-.25,1.19c-.28,1.33-1.01,2.52-2.05,3.38h0c-2.26,1.86-5.09,2.87-8.01,2.87Z"/>
|
||||
<path class="cls-6" d="M488.37,174.78l-3.4,16c-.23,1.09-1.2,1.88-2.32,1.88h0c-1.51,0-2.63-1.39-2.32-2.86l2.98-14.03c.31-1.47-.81-2.86-2.32-2.86h-4.04c-1.51,0-2.63-1.39-2.32-2.86l.03-.12c.23-1.1,1.2-1.88,2.32-1.88h19.77c1.51,0,2.63,1.39,2.32,2.86l-.03.12c-.23,1.1-1.2,1.88-2.32,1.88h-6.04c-1.12,0-2.08.78-2.32,1.88Z"/>
|
||||
<path class="cls-6" d="M505.5,189.68l4.2-19.69c.24-1.14,1.25-1.95,2.41-1.95h0c1.57,0,2.73,1.44,2.41,2.97l-4.2,19.69c-.24,1.14-1.25,1.95-2.41,1.95h0c-1.57,0-2.73-1.44-2.41-2.97Z"/>
|
||||
<path class="cls-6" d="M539.69,191.61l-9.6-14.15c-.48-.7-1.56-.49-1.74.34l-2.76,12.97c-.23,1.09-1.2,1.88-2.32,1.88h0c-1.51,0-2.63-1.39-2.32-2.86l4.13-19.43c.29-1.35,1.48-2.31,2.86-2.31h.53c1.06,0,2.06.53,2.65,1.41l9.51,14.05c.41.6,1.34.42,1.49-.29l2.83-13.29c.23-1.09,1.2-1.88,2.32-1.88h0c1.51,0,2.63,1.39,2.32,2.86l-4.22,19.87c-.23,1.09-1.2,1.88-2.32,1.88h-1.4c-.79,0-1.52-.39-1.96-1.04Z"/>
|
||||
<path class="cls-6" d="M573.43,192.64l-10.43.02c-1.83,0-3.56-.83-4.7-2.27l-.04-.05c-.95-1.2-1.31-2.74-.99-4.22l2.41-11.39c.34-1.6,1.21-3.04,2.48-4.08l1.22-1c1.26-1.04,2.85-1.6,4.48-1.6h10.94c1.72,0,3.34.79,4.4,2.14h0c1.02,1.3,1.42,2.99,1.08,4.62-.05.26-.11.51-.16.74-.16.75-.82,1.29-1.6,1.29h-1.49c-1.03,0-1.8-.96-1.59-1.97h0c.21-1.01-.55-1.96-1.59-1.96-3.11,0-9,0-11.62,0-.77,0-1.43.54-1.59,1.29l-2.46,11.65c-.21,1.01.56,1.97,1.6,1.97h11.59c.77,0,1.44-.54,1.6-1.29l.37-1.76c.21-1.01-.56-1.97-1.6-1.97h-5.86c-1.04,0-1.81-.96-1.59-1.97l.34-1.6c.16-.75.83-1.29,1.59-1.29h6.15c1.9,0,3.7.87,4.88,2.36l.15.19c.84,1.05,1.16,2.43.88,3.74l-.55,2.61c-.22,1.05-.8,1.99-1.63,2.67l-1.62,1.33c-1.42,1.17-3.21,1.81-5.05,1.81Z"/>
|
||||
<path class="cls-6" d="M629.48,182.79h-10.75c-1.12,0-2.08.78-2.32,1.87l-1.31,6.12c-.23,1.09-1.2,1.87-2.32,1.87h0c-1.51,0-2.63-1.39-2.32-2.86l4.22-19.87c.23-1.09,1.2-1.88,2.32-1.88h15.74c1.73,0,3.37.8,4.44,2.16h0c1.02,1.3,1.41,2.98,1.07,4.59l-.43,2.02c-.24,1.13-.85,2.15-1.75,2.89l-1.51,1.25c-1.43,1.19-3.23,1.83-5.09,1.83ZM631.75,172.9h-11.58c-.73,0-1.35.51-1.51,1.22l-.4,1.88c-.21.99.55,1.92,1.56,1.92h11.52c.82,0,1.54-.58,1.71-1.38l.34-1.6c.23-1.05-.57-2.04-1.65-2.04Z"/>
|
||||
<path class="cls-6" d="M665.75,189.79l.89-4.18c.31-1.47-.81-2.86-2.32-2.86h-10.07c-1.12,0-2.08.78-2.32,1.87l-1.32,6.15c-.23,1.1-1.21,1.88-2.33,1.87h-.02c-1.5,0-2.62-1.39-2.31-2.86l3.11-14.63c.4-1.88,1.43-3.57,2.92-4.79l.53-.43c1.5-1.22,3.37-1.89,5.3-1.89h10.74c1.55,0,3.01.71,3.97,1.93h0c1.13,1.45,1.57,3.32,1.19,5.11l-3.33,15.69c-.23,1.09-1.2,1.88-2.32,1.88h0c-1.51,0-2.63-1.39-2.32-2.86ZM667.11,172.9h-11.14c-.9,0-1.67.63-1.86,1.5l-.32,1.52c-.22,1.03.57,2,1.62,2h11.64c.71,0,1.33-.5,1.48-1.19l.35-1.64c.24-1.13-.61-2.19-1.77-2.19Z"/>
|
||||
<path class="cls-6" d="M700.08,191.39l-9.28-13.69c-.54-.79-1.76-.55-1.96.38l-2.7,12.69c-.23,1.09-1.2,1.88-2.32,1.88h0c-1.51,0-2.63-1.39-2.32-2.86l4.16-19.56c.27-1.28,1.4-2.19,2.71-2.19h.51c1.15,0,2.23.57,2.88,1.53l9.3,13.74c.45.67,1.49.47,1.66-.32l2.78-13.07c.23-1.09,1.2-1.88,2.32-1.88h0c1.51,0,2.63,1.39,2.32,2.86l-4.12,19.37c-.29,1.39-1.52,2.38-2.94,2.38h-.62c-.95,0-1.84-.47-2.37-1.26Z"/>
|
||||
<path class="cls-6" d="M717.03,189.71l4.2-19.75c.24-1.12,1.23-1.92,2.38-1.92h19.64c1.54,0,2.7,1.42,2.38,2.93h0c-.24,1.12-1.23,1.93-2.38,1.93h-15.81c-1.15,0-2.14.8-2.38,1.92l-.03.16c-.32,1.51.83,2.94,2.38,2.94h9.8c1.54,0,2.7,1.42,2.38,2.93h0c-.24,1.12-1.23,1.93-2.38,1.93h-11.87c-1.14,0-2.13.8-2.37,1.92l-.03.14c-.33,1.51.83,2.95,2.37,2.95h13.75c1.54,0,2.7,1.42,2.38,2.93h0c-.24,1.12-1.23,1.93-2.38,1.93h-19.64c-1.55,0-2.7-1.42-2.38-2.94Z"/>
|
||||
<path class="cls-6" d="M752.53,189.67l4.22-19.85c.23-1.1,1.2-1.88,2.33-1.88h0c1.51,0,2.64,1.39,2.33,2.87l-2.99,14c-.32,1.48.81,2.87,2.33,2.87h13.78c1.57,0,2.74,1.44,2.41,2.97h0c-.09.41-.14.86-.42,1.18-.76.87-1.78.71-3.38.71h-12.75c-2.1,0-2.93.07-5.76.01-1.58-.03-2.19-.74-2.09-2.89Z"/>
|
||||
</g>
|
||||
<path class="cls-2" d="M428.17,83.3h-2.67c-6.07,0-11.32,4.24-12.59,10.18l-7.54,35.19c-1.27,5.94-6.52,10.18-12.59,10.18h-.87c-8.18,0-14.28-7.52-12.6-15.52l4.96-23.63c1.77-8.45-4.67-16.4-13.31-16.4h0c-9.55,0-18.57-4.38-24.47-11.89l-.06-.08c-5.89-7.49-8.16-17.22-6.17-26.54l7.29-34.33c1.26-5.95,6.52-10.2,12.6-10.2h.87c8.18,0,14.28,7.52,12.6,15.52l-5.17,24.62c-.77,3.69.11,7.53,2.41,10.51h0c2.44,3.16,6.21,5.01,10.2,5.01h50.24c5.4,0,10.62-1.9,14.76-5.38h0c3.4-2.85,5.74-6.76,6.66-11.1l6.16-28.99c1.26-5.95,6.52-10.2,12.6-10.2h.95c8.19,0,14.3,7.54,12.6,15.55l-5.43,25.56c-2.5,11.74-8.89,22.3-18.14,29.95h0c-9.36,7.74-21.12,11.98-33.26,11.98Z"/>
|
||||
<path class="cls-7" d="M808.22,16.77h0c1.79-8.51-4.7-16.51-13.39-16.51h-94.61s-5.53,27.37-5.53,27.37h100.15c6.47,0,12.06-4.53,13.39-10.86Z"/>
|
||||
<path class="cls-9" d="M774.88,72.44h0c1.79-8.51-4.7-16.51-13.39-16.51h-72.87l-5.77,27.37h78.64c6.47,0,12.06-4.53,13.39-10.86Z"/>
|
||||
<path class="cls-13" d="M677.87,111.48l6.11-28.18h0l6.01-28.49h.05s5.78-27.18,5.78-27.18l5.79-27.03c.04-.18-.1-.34-.27-.34h-5.32c-12.69,0-23.65,8.88-26.29,21.29l-21.42,100.78c-1.81,8.51,4.68,16.53,13.39,16.53h110.59c6.47,0,12.06-4.53,13.39-10.86h0c1.79-8.51-4.7-16.51-13.39-16.51h-94.4Z"/>
|
||||
<path class="cls-5" d="M203.58,55.93l8.32-39.57c1.75-8.3-4.59-16.1-13.06-16.1h0c-6.3,0-11.75,4.41-13.06,10.58l-23.78,111.89c-1.77,8.31,4.57,16.13,13.06,16.13h0c6.29,0,11.73-4.4,13.05-10.55l9.66-45.01h0l5.82-27.37h0Z"/>
|
||||
<polygon class="cls-3" points="203.58 55.87 197.77 83.24 282.37 83.3 288.17 55.93 203.58 55.87"/>
|
||||
<path class="cls-8" d="M311.44.26c-6.29,0-11.73,4.4-13.05,10.55l-9.59,44.73h0l-6.55,30.92h-.03s-7.64,36.29-7.64,36.29c-1.75,8.3,4.58,16.1,13.06,16.1h.01c6.3,0,11.75-4.41,13.06-10.57l23.78-111.9c1.77-8.3-4.57-16.12-13.06-16.12h0Z"/>
|
||||
<polygon class="cls-11" points="288.73 55.94 288.7 55.93 288.7 55.93 288.17 55.93 282.37 83.3 282.88 83.3 282.22 86.46 282.25 86.47 288.73 55.94"/>
|
||||
<path class="cls-10" d="M21.82,21.46L.3,122.73c-1.77,8.31,4.57,16.13,13.06,16.13h0c6.29,0,11.73-4.4,13.05-10.55l9.66-45.01-.02.12,5.84-27.49,6.01-28.3h0L54.12.26h-6.12c-12.64,0-23.55,8.84-26.18,21.2Z"/>
|
||||
<path class="cls-12" d="M111.53,0l-57.79.26-5.95,27.37h66.44c9.04,0,15.77,8.34,13.87,17.18h0c-1.4,6.5-7.12,11.16-13.77,11.2l-72.69.53-5.73,27.37,69.83-.49c11.47-.08,24.22-2.55,33.06-9.86h0c6.97-5.77,14.29-13.29,16.46-31.62h0c-.56-20.89-7.73-28.5-7.73-28.5h0S140.06,1,111.53,0Z"/>
|
||||
<path class="cls-4" d="M506.81,21.58l-21.48,101.08c-1.77,8.34,4.59,16.2,13.12,16.2h0c6.32,0,11.78-4.41,13.11-10.59l9.65-44.96h.02l5.71-27.37h0l5.96-28.17,5.55-27.42s-.02-.08-.07-.08h-5.23c-12.71,0-23.69,8.89-26.33,21.32Z"/>
|
||||
<path class="cls-1" d="M636.82,13.71l-2.27-2.89c-5.24-6.67-13.25-10.57-21.73-10.57h-74.36l-5.55,27.37h78.11c3.05,0,5.35,2.78,4.77,5.78h0c-.21,1.11-.81,2.11-1.68,2.82l-16.44,13.56c-4.81,3.96-10.84,6.13-17.07,6.13h-53.68l-5.72,27.37h51.65c7.31,0,14.23,3.35,18.76,9.09l1.28,1.62c4.97,6.29,6.86,14.46,5.18,22.29l-1.48,6.87c-1.74,8.07,4.41,15.68,12.66,15.68h0c6.55,0,12.2-4.58,13.56-10.99l5.11-24.08c1.74-8.21-.24-16.77-5.42-23.38l-5.33-6.81c-1.76-2.25-1.41-5.48.79-7.3l14.59-12.04c4.67-3.85,7.88-9.18,9.12-15.1l.52-2.49c1.68-8.07-.28-16.47-5.38-22.95Z"/>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
23
samples/sample-website-index.html
Normal file
23
samples/sample-website-index.html
Normal file
|
@ -0,0 +1,23 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="flex flex-col bg-gray-50 justify-center h-screen text-center">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold">
|
||||
%DOMAIN%
|
||||
</h1>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<p class="text-xl">
|
||||
Welcome to PhyrePanel! <br />
|
||||
The simplest way to manage your websites.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
11
samples/ubuntu/nginx.conf.sample
Normal file
11
samples/ubuntu/nginx.conf.sample
Normal file
|
@ -0,0 +1,11 @@
|
|||
server {
|
||||
|
||||
server_name %SERVER_NAME% www.%SERVER_NAME%;
|
||||
|
||||
root %SERVER_ROOT%;
|
||||
charset utf-8;
|
||||
|
||||
location / {
|
||||
|
||||
}
|
||||
}
|
BIN
screenshots/dashboard.png
Normal file
BIN
screenshots/dashboard.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 305 KiB |
BIN
screenshots/install-screen.png
Normal file
BIN
screenshots/install-screen.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 300 KiB |
54
update/update-web-panel.sh
Normal file
54
update/update-web-panel.sh
Normal file
|
@ -0,0 +1,54 @@
|
|||
rm -rf /usr/local/phyre/update/web-panel-latest
|
||||
rm -rf /usr/local/phyre/update/phyre-web-panel.zip
|
||||
|
||||
wget https://github.com/CloudVisionApps/PhyrePanelWebDist/raw/main/phyre-web-panel.zip
|
||||
ls -la
|
||||
unzip -o phyre-web-panel.zip -d /usr/local/phyre/update/web-panel-latest
|
||||
|
||||
rm -rf /usr/local/phyre/web/vendor
|
||||
rm -rf /usr/local/phyre/web/composer.lock
|
||||
rm -rf /usr/local/phyre/web/routes
|
||||
rm -rf /usr/local/phyre/web/public
|
||||
rm -rf /usr/local/phyre/web/resources
|
||||
rm -rf /usr/local/phyre/web/database
|
||||
rm -rf /usr/local/phyre/web/config
|
||||
rm -rf /usr/local/phyre/web/app
|
||||
rm -rf /usr/local/phyre/web/bootstrap
|
||||
rm -rf /usr/local/phyre/web/lang
|
||||
rm -rf /usr/local/phyre/web/Modules
|
||||
rm -rf /usr/local/phyre/web/thirdparty
|
||||
|
||||
cp -r /usr/local/phyre/update/web-panel-latest/vendor /usr/local/phyre/web/vendor
|
||||
cp /usr/local/phyre/update/web-panel-latest/composer.lock /usr/local/phyre/web/composer.lock
|
||||
cp -r /usr/local/phyre/update/web-panel-latest/routes /usr/local/phyre/web/routes
|
||||
cp -r /usr/local/phyre/update/web-panel-latest/public /usr/local/phyre/web/public
|
||||
cp -r /usr/local/phyre/update/web-panel-latest/resources /usr/local/phyre/web/resources
|
||||
cp -r /usr/local/phyre/update/web-panel-latest/database /usr/local/phyre/web/database
|
||||
cp -r /usr/local/phyre/update/web-panel-latest/config /usr/local/phyre/web/config
|
||||
cp -r /usr/local/phyre/update/web-panel-latest/app /usr/local/phyre/web/app
|
||||
cp -r /usr/local/phyre/update/web-panel-latest/bootstrap /usr/local/phyre/web/bootstrap
|
||||
cp -r /usr/local/phyre/update/web-panel-latest/lang /usr/local/phyre/web/lang
|
||||
cp -r /usr/local/phyre/update/web-panel-latest/Modules /usr/local/phyre/web/Modules
|
||||
#cp -r /usr/local/phyre/update/web-panel-latest/thirdparty /usr/local/phyre/web/thirdparty
|
||||
|
||||
cp -r /usr/local/phyre/update/web-panel-latest/db-migrate.sh /usr/local/phyre/web/db-migrate.sh
|
||||
chmod +x /usr/local/phyre/web/db-migrate.sh
|
||||
#
|
||||
cd /usr/local/phyre/web
|
||||
#
|
||||
#
|
||||
#
|
||||
#PHYRE_PHP=/usr/local/phyre/php/bin/php
|
||||
##
|
||||
#$PHYRE_PHP -v
|
||||
#$PHYRE_PHP -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
||||
#$PHYRE_PHP ./composer-setup.php
|
||||
#$PHYRE_PHP -r "unlink('composer-setup.php');"
|
||||
|
||||
#rm -rf composer.lock
|
||||
#COMPOSER_ALLOW_SUPERUSER=1 $PHYRE_PHP composer.phar i --no-interaction --no-progress
|
||||
#COMPOSER_ALLOW_SUPERUSER=1 $PHYRE_PHP composer.phar dump-autoload --no-interaction
|
||||
|
||||
./db-migrate.sh
|
||||
|
||||
service phyre restart
|
1
version.txt
Normal file
1
version.txt
Normal file
|
@ -0,0 +1 @@
|
|||
0.0.2
|
18
web/.editorconfig
Normal file
18
web/.editorconfig
Normal file
|
@ -0,0 +1,18 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.{yml,yaml}]
|
||||
indent_size = 2
|
||||
|
||||
[docker-compose.yml]
|
||||
indent_size = 4
|
64
web/.env.example
Normal file
64
web/.env.example
Normal file
|
@ -0,0 +1,64 @@
|
|||
APP_NAME=Laravel
|
||||
APP_ENV=local
|
||||
APP_KEY=
|
||||
APP_DEBUG=true
|
||||
APP_URL=http://localhost
|
||||
|
||||
LOG_CHANNEL=stack
|
||||
LOG_DEPRECATIONS_CHANNEL=null
|
||||
LOG_LEVEL=debug
|
||||
|
||||
DB_CONNECTION=sqlite
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=laravel
|
||||
DB_USERNAME=root
|
||||
DB_PASSWORD=
|
||||
|
||||
MYSQL_HOST=127.0.0.1
|
||||
MYSQL_PORT=3306
|
||||
MYSQl_ROOT_USERNAME=root
|
||||
MYSQL_ROOT_PASSWORD=root
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=file
|
||||
FILESYSTEM_DISK=local
|
||||
QUEUE_CONNECTION=sync
|
||||
SESSION_DRIVER=file
|
||||
SESSION_LIFETIME=120
|
||||
|
||||
MEMCACHED_HOST=127.0.0.1
|
||||
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_MAILER=smtp
|
||||
MAIL_HOST=mailpit
|
||||
MAIL_PORT=1025
|
||||
MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_ENCRYPTION=null
|
||||
MAIL_FROM_ADDRESS="hello@example.com"
|
||||
MAIL_FROM_NAME="${APP_NAME}"
|
||||
|
||||
AWS_ACCESS_KEY_ID=
|
||||
AWS_SECRET_ACCESS_KEY=
|
||||
AWS_DEFAULT_REGION=us-east-1
|
||||
AWS_BUCKET=
|
||||
AWS_USE_PATH_STYLE_ENDPOINT=false
|
||||
|
||||
PUSHER_APP_ID=
|
||||
PUSHER_APP_KEY=
|
||||
PUSHER_APP_SECRET=
|
||||
PUSHER_HOST=
|
||||
PUSHER_PORT=443
|
||||
PUSHER_SCHEME=https
|
||||
PUSHER_APP_CLUSTER=mt1
|
||||
|
||||
VITE_APP_NAME="${APP_NAME}"
|
||||
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
|
||||
VITE_PUSHER_HOST="${PUSHER_HOST}"
|
||||
VITE_PUSHER_PORT="${PUSHER_PORT}"
|
||||
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
|
||||
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
11
web/.gitattributes
vendored
Normal file
11
web/.gitattributes
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
* text=auto eol=lf
|
||||
|
||||
*.blade.php diff=html
|
||||
*.css diff=css
|
||||
*.html diff=html
|
||||
*.md diff=markdown
|
||||
*.php diff=php
|
||||
|
||||
/.github export-ignore
|
||||
CHANGELOG.md export-ignore
|
||||
.styleci.yml export-ignore
|
18
web/.gitignore
vendored
Normal file
18
web/.gitignore
vendored
Normal file
|
@ -0,0 +1,18 @@
|
|||
/.phpunit.cache
|
||||
/node_modules
|
||||
/public/hot
|
||||
/public/storage
|
||||
/storage/*.key
|
||||
/vendor
|
||||
.env
|
||||
.env.backup
|
||||
.env.production
|
||||
.phpunit.result.cache
|
||||
Homestead.json
|
||||
Homestead.yaml
|
||||
auth.json
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
/.fleet
|
||||
/.idea
|
||||
/.vscode
|
92
web/Modules/Docker/App/Console/DockerContainers.php
Normal file
92
web/Modules/Docker/App/Console/DockerContainers.php
Normal file
|
@ -0,0 +1,92 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\App\Console;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Modules\Docker\App\Models\DockerContainer;
|
||||
use Modules\Docker\App\Models\DockerImage;
|
||||
use Modules\Docker\DockerApi;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
class DockerContainers extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*/
|
||||
protected $signature = 'docker:get-containers';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*/
|
||||
protected $description = 'Command description.';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$dockerApi = new DockerApi();
|
||||
$containers = $dockerApi->getContainers();
|
||||
if (!empty($containers)) {
|
||||
foreach($containers as $container) {
|
||||
|
||||
$findDockerContainer = DockerContainer::where('docker_id', $container['ID'])->first();
|
||||
|
||||
// if ($findDockerContainer) {
|
||||
// $findDockerContainer->delete();
|
||||
// }
|
||||
// continue;
|
||||
|
||||
if (!$findDockerContainer) {
|
||||
$findDockerContainer = new DockerContainer();
|
||||
$findDockerContainer->docker_id = $container['ID'];
|
||||
$findDockerContainer->environment_variables = [];
|
||||
}
|
||||
|
||||
$findDockerContainer->name = $container['Image'];
|
||||
$findDockerContainer->image = $container['Image'];
|
||||
$findDockerContainer->command = $container['Command'];
|
||||
$findDockerContainer->labels = $container['Labels'];
|
||||
$findDockerContainer->local_volumes = $container['LocalVolumes'];
|
||||
$findDockerContainer->mounts = $container['Mounts'];
|
||||
$findDockerContainer->names = $container['Names'];
|
||||
$findDockerContainer->networks = $container['Networks'];
|
||||
$findDockerContainer->ports = $container['Ports'];
|
||||
$findDockerContainer->running_for = $container['RunningFor'];
|
||||
$findDockerContainer->size = $container['Size'];
|
||||
$findDockerContainer->state = $container['State'];
|
||||
$findDockerContainer->status = $container['Status'];
|
||||
$findDockerContainer->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command arguments.
|
||||
*/
|
||||
protected function getArguments(): array
|
||||
{
|
||||
return [
|
||||
['example', InputArgument::REQUIRED, 'An example argument.'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command options.
|
||||
*/
|
||||
protected function getOptions(): array
|
||||
{
|
||||
return [
|
||||
['example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null],
|
||||
];
|
||||
}
|
||||
}
|
71
web/Modules/Docker/App/Console/DockerRunImage.php
Normal file
71
web/Modules/Docker/App/Console/DockerRunImage.php
Normal file
|
@ -0,0 +1,71 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\App\Console;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Modules\Docker\App\Models\DockerImage;
|
||||
use Modules\Docker\DockerApi;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
class DockerRunImage extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*/
|
||||
protected $signature = 'docker:run-image {name}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*/
|
||||
protected $description = 'Command description.';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$name = $this->argument('name');
|
||||
$dockerImage = DockerImage::where('name', $name)->first();
|
||||
if ($dockerImage) {
|
||||
$this->info('Running image: ' . $dockerImage->name);
|
||||
|
||||
$dockerApi = new DockerApi();
|
||||
$pullCommand = $dockerApi->runImage($name);
|
||||
|
||||
$this->info($pullCommand);
|
||||
|
||||
} else {
|
||||
$this->error('Image not found: ' . $name);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command arguments.
|
||||
*/
|
||||
protected function getArguments(): array
|
||||
{
|
||||
return [
|
||||
['example', InputArgument::REQUIRED, 'An example argument.'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command options.
|
||||
*/
|
||||
protected function getOptions(): array
|
||||
{
|
||||
return [
|
||||
['example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null],
|
||||
];
|
||||
}
|
||||
}
|
96
web/Modules/Docker/App/Console/DockerSearchImages.php
Normal file
96
web/Modules/Docker/App/Console/DockerSearchImages.php
Normal file
|
@ -0,0 +1,96 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\App\Console;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Modules\Docker\App\Models\DockerImage;
|
||||
use Modules\Docker\DockerApi;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
class DockerSearchImages extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*/
|
||||
protected $signature = 'docker:search-images {name}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*/
|
||||
protected $description = 'Command description.';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$this->info('Display this on the screen');
|
||||
$name = $this->argument('name');
|
||||
$this->info('You have entered: ' . $name);
|
||||
|
||||
$dockerApi = new DockerApi();
|
||||
$dockerSearch = $dockerApi->searchImages($name);
|
||||
|
||||
foreach($dockerSearch as $dockerImage) {
|
||||
|
||||
if ($dockerImage['IsOfficial'] == 'true') {
|
||||
$dockerImage['IsOfficial'] = 1;
|
||||
} else {
|
||||
$dockerImage['IsOfficial'] = 0;
|
||||
}
|
||||
if ($dockerImage['IsAutomated'] == 'true') {
|
||||
$dockerImage['IsAutomated'] = 1;
|
||||
} else {
|
||||
$dockerImage['IsAutomated'] = 0;
|
||||
}
|
||||
|
||||
$findDockerImage = DockerImage::where('name', $dockerImage['Name'])->first();
|
||||
if ($findDockerImage === null) {
|
||||
$findDockerImage = new DockerImage();
|
||||
$findDockerImage->name = $dockerImage['Name'];
|
||||
}
|
||||
|
||||
$findDockerImage->description = $dockerImage['Description'];
|
||||
$findDockerImage->star_count = $dockerImage['StarCount'];
|
||||
$findDockerImage->is_official = $dockerImage['IsOfficial'];
|
||||
$findDockerImage->is_automated = $dockerImage['IsAutomated'];
|
||||
$findDockerImage->save();
|
||||
|
||||
$this->info('Name: ' . $dockerImage['Name']);
|
||||
$this->info('Description: ' . $dockerImage['Description']);
|
||||
$this->info('Stars: ' . $dockerImage['StarCount']);
|
||||
$this->info('Official: ' . $dockerImage['IsOfficial']);
|
||||
$this->info('Automated: ' . $dockerImage['IsAutomated']);
|
||||
$this->info('_______________________________________');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command arguments.
|
||||
*/
|
||||
protected function getArguments(): array
|
||||
{
|
||||
return [
|
||||
['example', InputArgument::REQUIRED, 'An example argument.'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the console command options.
|
||||
*/
|
||||
protected function getOptions(): array
|
||||
{
|
||||
return [
|
||||
['example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null],
|
||||
];
|
||||
}
|
||||
}
|
0
web/Modules/Docker/App/Http/Controllers/.gitkeep
Normal file
0
web/Modules/Docker/App/Http/Controllers/.gitkeep
Normal file
67
web/Modules/Docker/App/Http/Controllers/DockerController.php
Normal file
67
web/Modules/Docker/App/Http/Controllers/DockerController.php
Normal file
|
@ -0,0 +1,67 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\App\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
|
||||
class DockerController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('docker::index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('docker::create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the specified resource.
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
return view('docker::show');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
return view('docker::edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, $id): RedirectResponse
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
87
web/Modules/Docker/App/Models/DockerContainer.php
Normal file
87
web/Modules/Docker/App/Models/DockerContainer.php
Normal file
|
@ -0,0 +1,87 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Modules\Docker\DockerApi;
|
||||
use Modules\Docker\DockerContainerApi;
|
||||
|
||||
class DockerContainer extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*/
|
||||
protected $fillable = [
|
||||
'name',
|
||||
'command',
|
||||
'docker_id',
|
||||
'image',
|
||||
'labels',
|
||||
'local_volumes',
|
||||
'mounts',
|
||||
'names',
|
||||
'networks',
|
||||
'ports',
|
||||
'running_for',
|
||||
'size',
|
||||
'state',
|
||||
'status',
|
||||
'memory_limit',
|
||||
'unlimited_memory',
|
||||
'automatic_start',
|
||||
'external_port',
|
||||
'volume_mapping',
|
||||
'environment_variables',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'environment_variables' => 'array',
|
||||
'volume_mapping' => 'array',
|
||||
];
|
||||
|
||||
|
||||
public static function boot()
|
||||
{
|
||||
parent::boot();
|
||||
|
||||
static::creating(function ($model) {
|
||||
|
||||
$dockerContainerApi = new DockerContainerApi();
|
||||
$dockerContainerApi->setImage($model->image);
|
||||
$dockerContainerApi->setEnvironmentVariables($model->environment_variables);
|
||||
$dockerContainerApi->setVolumeMapping($model->volume_mapping);
|
||||
// $dockerContainerApi->setMemoryLimit($model->memory_limit);
|
||||
// $dockerContainerApi->setUnlimitedMemory($model->unlimited_memory);
|
||||
// $dockerContainerApi->setAutomaticStart($model->automatic_start);
|
||||
$dockerContainerApi->setPort($model->port);
|
||||
$dockerContainerApi->setExternalPort($model->external_port);
|
||||
$createContainer = $dockerContainerApi->run();
|
||||
if (!isset($createContainer['ID'])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$model->image = $createContainer['Image'];
|
||||
$model->command = $createContainer['Command'];
|
||||
$model->labels = $createContainer['Labels'];
|
||||
$model->local_volumes = $createContainer['LocalVolumes'];
|
||||
$model->mounts = $createContainer['Mounts'];
|
||||
$model->names = $createContainer['Names'];
|
||||
$model->networks = $createContainer['Networks'];
|
||||
$model->ports = $createContainer['Ports'];
|
||||
$model->running_for = $createContainer['RunningFor'];
|
||||
$model->size = $createContainer['Size'];
|
||||
$model->state = $createContainer['State'];
|
||||
$model->status = $createContainer['Status'];
|
||||
$model->docker_id = $createContainer['ID'];
|
||||
|
||||
});
|
||||
|
||||
static::deleting(function ($model) {
|
||||
$dockerApi = new DockerApi();
|
||||
$dockerApi->removeContainerById($model->docker_id);
|
||||
});
|
||||
}
|
||||
}
|
17
web/Modules/Docker/App/Models/DockerImage.php
Normal file
17
web/Modules/Docker/App/Models/DockerImage.php
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
|
||||
class DockerImage extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*/
|
||||
protected $fillable = [];
|
||||
|
||||
}
|
0
web/Modules/Docker/App/Providers/.gitkeep
Normal file
0
web/Modules/Docker/App/Providers/.gitkeep
Normal file
131
web/Modules/Docker/App/Providers/DockerServiceProvider.php
Normal file
131
web/Modules/Docker/App/Providers/DockerServiceProvider.php
Normal file
|
@ -0,0 +1,131 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\App\Providers;
|
||||
|
||||
use BladeUI\Icons\Factory;
|
||||
use Illuminate\Support\Facades\Blade;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Modules\Docker\App\Console\DockerContainers;
|
||||
use Modules\Docker\App\Console\DockerRunImage;
|
||||
use Modules\Docker\App\Console\DockerSearchImages;
|
||||
|
||||
class DockerServiceProvider extends ServiceProvider
|
||||
{
|
||||
protected string $moduleName = 'Docker';
|
||||
|
||||
protected string $moduleNameLower = 'docker';
|
||||
|
||||
/**
|
||||
* Boot the application events.
|
||||
*/
|
||||
public function boot(): void
|
||||
{
|
||||
$this->registerCommands();
|
||||
$this->registerCommandSchedules();
|
||||
$this->registerTranslations();
|
||||
$this->registerConfig();
|
||||
$this->registerViews();
|
||||
$this->loadMigrationsFrom(module_path($this->moduleName, 'Database/migrations'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the service provider.
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
|
||||
// Register Phyre Icons set
|
||||
$this->callAfterResolving(Factory::class, function (Factory $factory) {
|
||||
$factory->add('docker', [
|
||||
'path' => __DIR__ . '/../../resources/assets/docker-svg',
|
||||
'prefix' => 'docker',
|
||||
]);
|
||||
});
|
||||
|
||||
$this->app->register(RouteServiceProvider::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register commands in the format of Command::class
|
||||
*/
|
||||
protected function registerCommands(): void
|
||||
{
|
||||
$this->commands([
|
||||
DockerSearchImages::class,
|
||||
DockerRunImage::class,
|
||||
DockerContainers::class
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register command Schedules.
|
||||
*/
|
||||
protected function registerCommandSchedules(): void
|
||||
{
|
||||
// $this->app->booted(function () {
|
||||
// $schedule = $this->app->make(Schedule::class);
|
||||
// $schedule->command('inspire')->hourly();
|
||||
// });
|
||||
}
|
||||
|
||||
/**
|
||||
* Register translations.
|
||||
*/
|
||||
public function registerTranslations(): void
|
||||
{
|
||||
$langPath = resource_path('lang/modules/'.$this->moduleNameLower);
|
||||
|
||||
if (is_dir($langPath)) {
|
||||
$this->loadTranslationsFrom($langPath, $this->moduleNameLower);
|
||||
$this->loadJsonTranslationsFrom($langPath);
|
||||
} else {
|
||||
$this->loadTranslationsFrom(module_path($this->moduleName, 'lang'), $this->moduleNameLower);
|
||||
$this->loadJsonTranslationsFrom(module_path($this->moduleName, 'lang'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register config.
|
||||
*/
|
||||
protected function registerConfig(): void
|
||||
{
|
||||
$this->publishes([module_path($this->moduleName, 'config/config.php') => config_path($this->moduleNameLower.'.php')], 'config');
|
||||
$this->mergeConfigFrom(module_path($this->moduleName, 'config/config.php'), $this->moduleNameLower);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register views.
|
||||
*/
|
||||
public function registerViews(): void
|
||||
{
|
||||
$viewPath = resource_path('views/modules/'.$this->moduleNameLower);
|
||||
$sourcePath = module_path($this->moduleName, 'resources/views');
|
||||
|
||||
$this->publishes([$sourcePath => $viewPath], ['views', $this->moduleNameLower.'-module-views']);
|
||||
|
||||
$this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower);
|
||||
|
||||
$componentNamespace = str_replace('/', '\\', config('modules.namespace').'\\'.$this->moduleName.'\\'.config('modules.paths.generator.component-class.path'));
|
||||
Blade::componentNamespace($componentNamespace, $this->moduleNameLower);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the services provided by the provider.
|
||||
*/
|
||||
public function provides(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
private function getPublishableViewPaths(): array
|
||||
{
|
||||
$paths = [];
|
||||
foreach (config('view.paths') as $path) {
|
||||
if (is_dir($path.'/modules/'.$this->moduleNameLower)) {
|
||||
$paths[] = $path.'/modules/'.$this->moduleNameLower;
|
||||
}
|
||||
}
|
||||
|
||||
return $paths;
|
||||
}
|
||||
}
|
59
web/Modules/Docker/App/Providers/RouteServiceProvider.php
Normal file
59
web/Modules/Docker/App/Providers/RouteServiceProvider.php
Normal file
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\App\Providers;
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
|
||||
|
||||
class RouteServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* The module namespace to assume when generating URLs to actions.
|
||||
*/
|
||||
protected string $moduleNamespace = 'Modules\Docker\App\Http\Controllers';
|
||||
|
||||
/**
|
||||
* Called before routes are registered.
|
||||
*
|
||||
* Register any model bindings or pattern based filters.
|
||||
*/
|
||||
public function boot(): void
|
||||
{
|
||||
parent::boot();
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the routes for the application.
|
||||
*/
|
||||
public function map(): void
|
||||
{
|
||||
$this->mapApiRoutes();
|
||||
|
||||
$this->mapWebRoutes();
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the "web" routes for the application.
|
||||
*
|
||||
* These routes all receive session state, CSRF protection, etc.
|
||||
*/
|
||||
protected function mapWebRoutes(): void
|
||||
{
|
||||
Route::middleware('web')
|
||||
->namespace($this->moduleNamespace)
|
||||
->group(module_path('Docker', '/routes/web.php'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the "api" routes for the application.
|
||||
*
|
||||
* These routes are typically stateless.
|
||||
*/
|
||||
protected function mapApiRoutes(): void
|
||||
{
|
||||
Route::prefix('api')
|
||||
->middleware('api')
|
||||
->namespace($this->moduleNamespace)
|
||||
->group(module_path('Docker', '/routes/api.php'));
|
||||
}
|
||||
}
|
0
web/Modules/Docker/Database/Seeders/.gitkeep
Normal file
0
web/Modules/Docker/Database/Seeders/.gitkeep
Normal file
16
web/Modules/Docker/Database/Seeders/DockerDatabaseSeeder.php
Normal file
16
web/Modules/Docker/Database/Seeders/DockerDatabaseSeeder.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class DockerDatabaseSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
// $this->call([]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('docker_containers', function (Blueprint $table) {
|
||||
$table->id();
|
||||
|
||||
$table->string('name')->nullable();
|
||||
$table->string('command')->nullable();
|
||||
$table->string('docker_id')->nullable();
|
||||
$table->string('image')->nullable();
|
||||
$table->longText('labels')->nullable();
|
||||
$table->string('local_volumes')->nullable();
|
||||
$table->string('mounts')->nullable();
|
||||
$table->string('names')->nullable();
|
||||
$table->string('networks')->nullable();
|
||||
$table->string('ports')->nullable();
|
||||
$table->string('running_for')->nullable();
|
||||
$table->string('size')->nullable();
|
||||
$table->string('state')->nullable();
|
||||
$table->string('status')->nullable();
|
||||
|
||||
$table->string('memory_limit')->nullable();
|
||||
$table->tinyInteger('unlimited_memory')->nullable();
|
||||
$table->tinyInteger('automatic_start')->nullable();
|
||||
$table->string('port')->nullable();
|
||||
$table->string('external_port')->nullable();
|
||||
$table->longText('volume_mapping')->nullable();
|
||||
|
||||
$table->longText('environment_variables')->nullable();
|
||||
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('docker_containers');
|
||||
}
|
||||
};
|
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('docker_images', function (Blueprint $table) {
|
||||
$table->id();
|
||||
|
||||
$table->string('name');
|
||||
$table->longText('description')->nullable();
|
||||
$table->integer('star_count')->nullable();
|
||||
$table->boolean('is_official')->default(false);
|
||||
$table->boolean('is_automated')->default(false);
|
||||
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('docker_images');
|
||||
}
|
||||
};
|
144
web/Modules/Docker/DockerApi.php
Normal file
144
web/Modules/Docker/DockerApi.php
Normal file
|
@ -0,0 +1,144 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker;
|
||||
|
||||
class DockerApi
|
||||
{
|
||||
public $logFile = '';
|
||||
|
||||
public function setLogFile($logFile)
|
||||
{
|
||||
$this->logFile = $logFile;
|
||||
}
|
||||
|
||||
public function pullImage($name)
|
||||
{
|
||||
$commandId = rand(10000, 99999);
|
||||
$commands = [];
|
||||
$commands[] = 'docker pull ' . $name;
|
||||
|
||||
$shellFileContent = '';
|
||||
|
||||
foreach ($commands as $command) {
|
||||
$shellFileContent .= $command . PHP_EOL;
|
||||
}
|
||||
|
||||
$shellFileContent .= 'echo "DONE!"' . PHP_EOL;
|
||||
$shellFileContent .= 'rm -f /tmp/docker-pull-image-'.$commandId.'.sh';
|
||||
|
||||
file_put_contents('/tmp/docker-pull-image-'.$commandId.'.sh', $shellFileContent);
|
||||
shell_exec('bash /tmp/docker-pull-image-'.$commandId.'.sh >> ' . $this->logFile . ' &');
|
||||
|
||||
}
|
||||
|
||||
public function searchImages($keyword, $filters = [])
|
||||
{
|
||||
$filtersString = ''; // --filter is-official=true
|
||||
|
||||
$output = shell_exec('docker search --format "{{json .}}" --no-trunc '.$filtersString.' ' . $keyword);
|
||||
$output = trim($output);
|
||||
$output = str_replace("\n", ',', $output);
|
||||
$output = '[' . $output . ']';
|
||||
$dockerSearch = json_decode($output, true);
|
||||
|
||||
if ($dockerSearch === null) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return $dockerSearch;
|
||||
}
|
||||
|
||||
public function getContainers()
|
||||
{
|
||||
$output = shell_exec('docker ps -a --format "{{json .}}"');
|
||||
$output = trim($output);
|
||||
$output = str_replace("\n", ',', $output);
|
||||
$output = '[' . $output . ']';
|
||||
$dockerContainers = json_decode($output, true);
|
||||
|
||||
if ($dockerContainers === null) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return $dockerContainers;
|
||||
}
|
||||
|
||||
public function removeContainerById($id)
|
||||
{
|
||||
shell_exec('docker rm -f ' . $id);
|
||||
}
|
||||
|
||||
public function restartContainer($id)
|
||||
{
|
||||
shell_exec('docker restart ' . $id);
|
||||
}
|
||||
|
||||
public function stopContainer($id)
|
||||
{
|
||||
shell_exec('docker stop ' . $id);
|
||||
}
|
||||
|
||||
public function startContainer($id)
|
||||
{
|
||||
shell_exec('docker start ' . $id);
|
||||
}
|
||||
|
||||
public function getContainerLogs($id)
|
||||
{
|
||||
$output = shell_exec('docker logs ' . $id .' > /tmp/docker-logs-'.$id.'.log 2>&1');
|
||||
$logContent = '';
|
||||
if (file_exists('/tmp/docker-logs-'.$id.'.log')) {
|
||||
$logContent = file_get_contents('/tmp/docker-logs-'.$id.'.log');
|
||||
}
|
||||
return $logContent;
|
||||
}
|
||||
|
||||
public function getContainerStats($id)
|
||||
{
|
||||
$output = shell_exec('docker stats --format json --no-stream ' . $id);
|
||||
$output = json_decode($output, true);
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
public function getContainerProcesses($id)
|
||||
{
|
||||
$output = shell_exec('docker top ' . $id);
|
||||
return $output;
|
||||
}
|
||||
|
||||
public function getContainerById($id)
|
||||
{
|
||||
$output = shell_exec('docker ps -f id='.$id.' -a --format "{{json .}}"');
|
||||
|
||||
$output = trim($output);
|
||||
$output = str_replace("\n", ',', $output);
|
||||
$output = '[' . $output . ']';
|
||||
$dockerContainer = json_decode($output, true);
|
||||
|
||||
if (!isset($dockerContainer[0])) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return $dockerContainer[0];
|
||||
|
||||
}
|
||||
|
||||
public function getContainerInspect($id)
|
||||
{
|
||||
$output = shell_exec('docker inspect ' . $id);
|
||||
return $output;
|
||||
}
|
||||
|
||||
public function getDockerImageInspect($name)
|
||||
{
|
||||
$output = shell_exec('docker image inspect ' . $name);
|
||||
$output = json_decode($output, true);
|
||||
if (isset($output[0])) {
|
||||
return $output[0];
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
}
|
89
web/Modules/Docker/DockerContainerApi.php
Normal file
89
web/Modules/Docker/DockerContainerApi.php
Normal file
|
@ -0,0 +1,89 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker;
|
||||
|
||||
use function AlibabaCloud\Client\json;
|
||||
|
||||
class DockerContainerApi
|
||||
{
|
||||
public $image = '';
|
||||
public $environmentVariables = [];
|
||||
public $volumeMapping = [];
|
||||
|
||||
public $port = '';
|
||||
public $externalPort = '';
|
||||
|
||||
public function setImage($image)
|
||||
{
|
||||
$this->image = $image;
|
||||
}
|
||||
|
||||
public function setEnvironmentVariables($environmentVariables)
|
||||
{
|
||||
$this->environmentVariables = $environmentVariables;
|
||||
}
|
||||
|
||||
public function setVolumeMapping($volumeMapping)
|
||||
{
|
||||
$this->volumeMapping = $volumeMapping;
|
||||
}
|
||||
|
||||
public function setPort($port)
|
||||
{
|
||||
$this->port = $port;
|
||||
}
|
||||
|
||||
public function setExternalPort($externalPort)
|
||||
{
|
||||
$this->externalPort = $externalPort;
|
||||
}
|
||||
|
||||
public function recreate($containerId)
|
||||
{
|
||||
shell_exec('docker stop ' . $containerId);
|
||||
shell_exec('docker rm ' . $containerId);
|
||||
|
||||
return $this->run();
|
||||
}
|
||||
|
||||
public function run()
|
||||
{
|
||||
$commandId = rand(10000, 99999);
|
||||
$commands = [];
|
||||
$commands[] = 'docker run -d ' . $this->image;
|
||||
|
||||
if (!empty($this->port)) {
|
||||
$commands[] = '-p ' . $this->port . ':' . $this->externalPort;
|
||||
}
|
||||
|
||||
if (!empty($this->environmentVariables)) {
|
||||
foreach ($this->environmentVariables as $key => $value) {
|
||||
$commands[] = '-e ' . $key . '=' . $value;
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($this->volumeMapping)) {
|
||||
foreach ($this->volumeMapping as $key => $value) {
|
||||
$commands[] = '-v ' . $key . ':' . $value;
|
||||
}
|
||||
}
|
||||
|
||||
$shellFileContent = '';
|
||||
|
||||
foreach ($commands as $command) {
|
||||
$shellFileContent .= $command . PHP_EOL;
|
||||
}
|
||||
|
||||
$shellFileContent .= 'rm -f /tmp/docker-run-container-'.$commandId.'.sh';
|
||||
|
||||
file_put_contents('/tmp/docker-run-container-'.$commandId.'.sh', $shellFileContent);
|
||||
$output = shell_exec('bash /tmp/docker-run-container-'.$commandId.'.sh');
|
||||
|
||||
// Get docker container id from output
|
||||
$dockerContainerId = trim($output);
|
||||
$output = shell_exec('docker ps --format json --filter id='.$dockerContainerId);
|
||||
$output = json_decode($output, true);
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,150 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\Filament\Clusters\Docker\Pages;
|
||||
|
||||
use Filament\Actions\Action;
|
||||
use Filament\Forms\Components\Actions;
|
||||
use Filament\Forms\Components\Checkbox;
|
||||
use Filament\Forms\Components\Grid;
|
||||
use Filament\Forms\Components\Section;
|
||||
use Filament\Forms\Components\Select;
|
||||
use Filament\Forms\Components\Tabs;
|
||||
use Filament\Forms\Components\Tabs\Tab;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Toggle;
|
||||
use Filament\Forms\Concerns\InteractsWithForms;
|
||||
use Filament\Forms\Contracts\HasForms;
|
||||
use Filament\Pages\Page;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
use Illuminate\Support\Str;
|
||||
use Modules\Docker\App\Models\DockerContainer;
|
||||
use Modules\Docker\App\Models\DockerImage;
|
||||
use Modules\Docker\DockerApi;
|
||||
use Modules\Docker\Filament\Clusters\DockerCluster;
|
||||
|
||||
class DockerCatalog extends Page implements HasForms
|
||||
{
|
||||
use InteractsWithForms;
|
||||
|
||||
// protected static ?string $navigationGroup = 'Docker';
|
||||
|
||||
protected static ?string $cluster = DockerCluster::class;
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-cog';
|
||||
|
||||
protected static ?int $navigationSort = 1;
|
||||
|
||||
protected static string $view = 'docker::filament.pages.docker-catalog';
|
||||
|
||||
public $keyword = '';
|
||||
public $filterOfficial = true;
|
||||
public $filterAutomated = true;
|
||||
public $filterStarred = true;
|
||||
|
||||
public $pullLog = '';
|
||||
public $pullLogFile = '';
|
||||
public $pullLogPulling = false;
|
||||
|
||||
public $pullImageName = '';
|
||||
|
||||
public function updatedKeyword()
|
||||
{
|
||||
if (empty($this->keyword)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Artisan::call('docker:search-images "' . $this->keyword.'"');
|
||||
}
|
||||
|
||||
public function getPullLog()
|
||||
{
|
||||
if (file_exists($this->pullLogFile)) {
|
||||
$logContent = file_get_contents($this->pullLogFile);
|
||||
$this->pullLog = str_replace("\n", "<br>", $logContent);
|
||||
}
|
||||
|
||||
if (str_contains($this->pullLog, 'DONE!')) {
|
||||
$this->pullLogPulling = false;
|
||||
$this->dispatch('close-modal', id: 'pull-docker-image');
|
||||
|
||||
return $this->redirect(route('filament.admin.docker.resources.docker-containers.create') . '?dockerImage=' . $this->pullImageName);
|
||||
}
|
||||
}
|
||||
|
||||
public function pullDockerImage($dockerImageName)
|
||||
{
|
||||
$dockerImage = DockerImage::where('name', $dockerImageName)->first();
|
||||
if ($dockerImage) {
|
||||
|
||||
$this->pullImageName = $dockerImageName;
|
||||
|
||||
$this->dispatch('open-modal', id: 'pull-docker-image');
|
||||
|
||||
$dockerLogPath = storage_path('logs/docker/pull-'.Str::slug($dockerImageName).'.log');
|
||||
if (!is_dir(dirname($dockerLogPath))) {
|
||||
shell_exec('mkdir -p '.dirname($dockerLogPath));
|
||||
}
|
||||
$this->pullLogFile = $dockerLogPath;
|
||||
|
||||
$dockerApi = new DockerApi();
|
||||
$dockerApi->setLogFile(storage_path('logs/docker/pull-'.Str::slug($dockerImageName).'.log'));
|
||||
$dockerApi->pullImage($dockerImage->name);
|
||||
|
||||
$this->pullLogPulling = true;
|
||||
|
||||
$this->getPullLog();
|
||||
}
|
||||
}
|
||||
|
||||
public function removeDockerContainer($containerId)
|
||||
{
|
||||
$findDockerContainer = DockerContainer::where('id', $containerId)->first();
|
||||
if ($findDockerContainer) {
|
||||
$dockerApi = new DockerApi();
|
||||
$dockerApi->removeContainerById($findDockerContainer->docker_id);
|
||||
$findDockerContainer->delete();
|
||||
}
|
||||
}
|
||||
|
||||
protected function getViewData(): array
|
||||
{
|
||||
$findImagesQuery = DockerImage::query();
|
||||
if ($this->keyword) {
|
||||
$findImagesQuery->where('name', 'like', '%' . $this->keyword . '%');
|
||||
}
|
||||
$findImages = $findImagesQuery->get();
|
||||
|
||||
$findDockerContainers = DockerContainer::orderBy('id', 'desc')->get();
|
||||
|
||||
return [
|
||||
'dockerImages' => $findImages->toArray(),
|
||||
'dockerContainers' => $findDockerContainers->toArray(),
|
||||
];
|
||||
}
|
||||
protected function getFormSchema(): array
|
||||
{
|
||||
return [
|
||||
|
||||
TextInput::make('keyword')
|
||||
->live()
|
||||
->placeholder('Search for docker images...')
|
||||
->label('Search'),
|
||||
|
||||
Grid::make('4')
|
||||
->schema([
|
||||
|
||||
Checkbox::make('filterOfficial')
|
||||
->label('Official'),
|
||||
|
||||
Checkbox::make('filterAutomated')
|
||||
->label('Automated'),
|
||||
|
||||
Checkbox::make('filterStarred')
|
||||
->label('Starred'),
|
||||
|
||||
])
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\Filament\Clusters\Docker\Pages;
|
||||
|
||||
use Filament\Forms\Components\Section;
|
||||
use Filament\Forms\Components\Select;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Toggle;
|
||||
use Modules\Docker\Filament\Clusters\DockerCluster;
|
||||
use Outerweb\FilamentSettings\Filament\Pages\Settings as BaseSettings;
|
||||
|
||||
class Settings extends BaseSettings
|
||||
{
|
||||
protected static ?string $navigationGroup = 'Docker';
|
||||
|
||||
protected static ?string $cluster = DockerCluster::class;
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-cog';
|
||||
|
||||
protected static ?int $navigationSort = 3;
|
||||
|
||||
public function schema(): array
|
||||
{
|
||||
return [
|
||||
|
||||
Section::make('Settings')
|
||||
->schema([
|
||||
|
||||
|
||||
|
||||
]),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,142 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\Filament\Clusters\Docker\Resources;
|
||||
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Resources\Resource;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Table;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\SoftDeletingScope;
|
||||
use Modules\Docker\App\Models\DockerContainer;
|
||||
use Modules\Docker\DockerApi;
|
||||
use Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource\Pages\CreateDockerContainer;
|
||||
use Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource\Pages\EditDockerContainer;
|
||||
use Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource\Pages\ListDockerContainers;
|
||||
use Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource\Pages\ViewDockerContainer;
|
||||
use Modules\Docker\Filament\Clusters\DockerCluster;
|
||||
|
||||
|
||||
class DockerContainerResource extends Resource
|
||||
{
|
||||
protected static ?string $model = DockerContainer::class;
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
|
||||
|
||||
protected static ?string $cluster = DockerCluster::class;
|
||||
|
||||
protected static ?int $navigationSort = 2;
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
$dockerImage = request('dockerImage', null);
|
||||
$environmentVariables = [];
|
||||
|
||||
$dockerFullImageName = '';
|
||||
$dockerApi = new DockerApi();
|
||||
$dockerImageInspect = $dockerApi->getDockerImageInspect($dockerImage);
|
||||
if (isset($dockerImageInspect['RepoTags'][0])) {
|
||||
$dockerFullImageName = $dockerImageInspect['RepoTags'][0];
|
||||
}
|
||||
if (isset($dockerImageInspect['Config']['Env'])) {
|
||||
foreach ($dockerImageInspect['Config']['Env'] as $env) {
|
||||
$envParts = explode('=', $env);
|
||||
$environmentVariables[$envParts[0]] = $envParts[1];
|
||||
}
|
||||
}
|
||||
$defaultPort = '';
|
||||
if (isset($dockerImageInspect['Config']['ExposedPorts'])) {
|
||||
foreach ($dockerImageInspect['Config']['ExposedPorts'] as $port => $value) {
|
||||
$port = str_replace('/tcp', '', $port);
|
||||
$port = str_replace('/udp', '', $port);
|
||||
$port = str_replace('tcp', '', $port);
|
||||
$port = str_replace('udp', '', $port);
|
||||
$port = str_replace('/', '', $port);
|
||||
$defaultPort = $port;
|
||||
}
|
||||
}
|
||||
|
||||
return $form
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('name')
|
||||
->default($dockerFullImageName)
|
||||
->label('Container Name')->columnSpanFull(),
|
||||
|
||||
Forms\Components\TextInput::make('memory_limit')
|
||||
->label('Memory Limit (MB)')
|
||||
->default(512)
|
||||
->numeric()
|
||||
->columnSpanFull(),
|
||||
Forms\Components\Toggle::make('unlimited_memory')
|
||||
->label('Unlimited Memory')
|
||||
->columnSpanFull(),
|
||||
|
||||
Forms\Components\Toggle::make('automatic_start')
|
||||
->label('Automatic start after system reboot')
|
||||
->columnSpanFull(),
|
||||
|
||||
Forms\Components\TextInput::make('port')
|
||||
->label('Port')
|
||||
->default($defaultPort)
|
||||
->columnSpan(1),
|
||||
|
||||
Forms\Components\TextInput::make('external_port')
|
||||
->label('External Port')
|
||||
->default($defaultPort)
|
||||
->columnSpan(1),
|
||||
|
||||
|
||||
Forms\Components\Select::make('image')
|
||||
->label('Image')
|
||||
->options([$dockerImage=>$dockerFullImageName])
|
||||
->default($dockerImage)->columnSpanFull(),
|
||||
|
||||
Forms\Components\KeyValue::make('volume_mapping')
|
||||
->label('Volume Mapping')
|
||||
->columnSpanFull(),
|
||||
|
||||
Forms\Components\KeyValue::make('environment_variables')
|
||||
->label('Environment Variables')
|
||||
->default($environmentVariables)
|
||||
->columnSpanFull(),
|
||||
|
||||
]);
|
||||
}
|
||||
|
||||
public static function table(Table $table): Table
|
||||
{
|
||||
return $table
|
||||
->columns([
|
||||
|
||||
])
|
||||
->filters([
|
||||
//
|
||||
])
|
||||
->actions([
|
||||
Tables\Actions\EditAction::make(),
|
||||
])
|
||||
->bulkActions([
|
||||
Tables\Actions\BulkActionGroup::make([
|
||||
Tables\Actions\DeleteBulkAction::make(),
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
public static function getRelations(): array
|
||||
{
|
||||
return [
|
||||
//
|
||||
];
|
||||
}
|
||||
|
||||
public static function getPages(): array
|
||||
{
|
||||
return [
|
||||
'index' => ListDockerContainers::route('/'),
|
||||
'create' => CreateDockerContainer::route('/create'),
|
||||
'edit' => EditDockerContainer::route('/{record}/edit'),
|
||||
'view'=> ViewDockerContainer::route('/{record}'),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
namespace Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource\Pages;
|
||||
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\CreateRecord;
|
||||
use Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource;
|
||||
|
||||
class CreateDockerContainer extends CreateRecord
|
||||
{
|
||||
protected static string $resource = DockerContainerResource::class;
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
namespace Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource\Pages;
|
||||
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\EditRecord;
|
||||
use Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource;
|
||||
|
||||
class EditDockerContainer extends EditRecord
|
||||
{
|
||||
protected static string $resource = DockerContainerResource::class;
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
Actions\DeleteAction::make(),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
namespace Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource\Pages;
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\ListRecords;
|
||||
use Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource;
|
||||
|
||||
class ListDockerContainers extends ListRecords
|
||||
{
|
||||
protected static string $resource = DockerContainerResource::class;
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
Actions\CreateAction::make(),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,110 @@
|
|||
<?php
|
||||
namespace Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource\Pages;
|
||||
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Infolists\Components\Actions;
|
||||
use Filament\Infolists\Components\Entry;
|
||||
use Filament\Infolists\Components\TextEntry;
|
||||
use Filament\Infolists\Components\ViewEntry;
|
||||
use Filament\Infolists\Infolist;
|
||||
use Filament\Resources\Pages\EditRecord;
|
||||
use Filament\Resources\Pages\ViewRecord;
|
||||
use Modules\Docker\App\Models\DockerContainer;
|
||||
use Modules\Docker\DockerApi;
|
||||
use Modules\Docker\DockerContainerApi;
|
||||
use Modules\Docker\Filament\Clusters\Docker\Resources\DockerContainerResource;
|
||||
|
||||
class ViewDockerContainer extends ViewRecord
|
||||
{
|
||||
protected static string $resource = DockerContainerResource::class;
|
||||
|
||||
public $containerLog = '';
|
||||
|
||||
public function infolist(Infolist $infolist): Infolist
|
||||
{
|
||||
$dockerApi = new DockerApi();
|
||||
// $containerStats = $dockerApi->getContainerStats($this->record->docker_id);
|
||||
// $containerProcesses = $dockerApi->getContainerProcesses($this->record->docker_id);
|
||||
$containerLogs = $dockerApi->getContainerLogs($this->record->docker_id);
|
||||
// $container = $dockerApi->getContainerById($this->record->docker_id);
|
||||
|
||||
if ($containerLogs) {
|
||||
$containerLogs = str_replace("\n", "<br>", $containerLogs);
|
||||
$this->containerLog = $containerLogs;
|
||||
}
|
||||
|
||||
return $infolist
|
||||
->schema([
|
||||
|
||||
ViewEntry::make('status')
|
||||
->columnSpanFull()
|
||||
->view('docker::filament.infolists.docker-container.actions')
|
||||
->registerActions([
|
||||
Actions\Action::make('stop')
|
||||
->label('Stop')
|
||||
->color('primary'),
|
||||
|
||||
Actions\Action::make('start')
|
||||
->label('Start')
|
||||
->color('primary'),
|
||||
|
||||
Actions\Action::make('restart')
|
||||
->label('Restart')
|
||||
->color('success'),
|
||||
|
||||
|
||||
Actions\Action::make('recreate')
|
||||
->label('Recreate')
|
||||
->action('recreate')
|
||||
->color('info'),
|
||||
|
||||
|
||||
Actions\Action::make('delete')
|
||||
->label('Delete')
|
||||
->color('danger'),
|
||||
]),
|
||||
|
||||
ViewEntry::make('containerLogs')
|
||||
->columnSpanFull()
|
||||
->view('docker::filament.infolists.docker-container.logs',[
|
||||
'containerLog' => $containerLogs
|
||||
])
|
||||
|
||||
]);
|
||||
}
|
||||
|
||||
public function recreate()
|
||||
{
|
||||
$dockerContainerApi = new DockerContainerApi();
|
||||
$dockerContainerApi->setImage($this->record->image);
|
||||
$dockerContainerApi->setEnvironmentVariables($this->record->environment_variables);
|
||||
$dockerContainerApi->setVolumeMapping($this->record->volume_mapping);
|
||||
$dockerContainerApi->setPort($this->record->port);
|
||||
$dockerContainerApi->setExternalPort($this->record->external_port);
|
||||
|
||||
$newDockerImage = $dockerContainerApi->recreate($this->record->docker_id);
|
||||
if (!isset($newDockerImage['ID'])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->record->image = $newDockerImage['Image'];
|
||||
$this->record->command = $newDockerImage['Command'];
|
||||
$this->record->labels = $newDockerImage['Labels'];
|
||||
$this->record->local_volumes = $newDockerImage['LocalVolumes'];
|
||||
$this->record->mounts = $newDockerImage['Mounts'];
|
||||
$this->record->names = $newDockerImage['Names'];
|
||||
$this->record->networks = $newDockerImage['Networks'];
|
||||
$this->record->ports = $newDockerImage['Ports'];
|
||||
$this->record->running_for = $newDockerImage['RunningFor'];
|
||||
$this->record->size = $newDockerImage['Size'];
|
||||
$this->record->save();
|
||||
|
||||
}
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
// DeleteAction::make(),
|
||||
];
|
||||
}
|
||||
}
|
13
web/Modules/Docker/Filament/Clusters/DockerCluster.php
Normal file
13
web/Modules/Docker/Filament/Clusters/DockerCluster.php
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker\Filament\Clusters;
|
||||
|
||||
use Filament\Clusters\Cluster;
|
||||
|
||||
class DockerCluster extends Cluster
|
||||
{
|
||||
protected static ?string $navigationIcon = 'docker-logo';
|
||||
|
||||
protected static ?string $navigationGroup = 'Server Management';
|
||||
|
||||
}
|
15
web/Modules/Docker/PostInstall.php
Normal file
15
web/Modules/Docker/PostInstall.php
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Docker;
|
||||
|
||||
class PostInstall
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
$installDockerShellFile = base_path('Modules/Docker/shell-scripts/install-docker.sh');
|
||||
|
||||
shell_exec("chmod +x $installDockerShellFile");
|
||||
shell_exec("bash $installDockerShellFile");
|
||||
|
||||
}
|
||||
}
|
31
web/Modules/Docker/composer.json
Normal file
31
web/Modules/Docker/composer.json
Normal file
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
"name": "nwidart/docker",
|
||||
"description": "",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Widart",
|
||||
"email": "n.widart@gmail.com"
|
||||
}
|
||||
],
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"providers": [],
|
||||
"aliases": {
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Modules\\Docker\\": "",
|
||||
"Modules\\Docker\\App\\": "app/",
|
||||
"Modules\\Docker\\Database\\Factories\\": "database/factories/",
|
||||
"Modules\\Docker\\Database\\Seeders\\": "database/seeders/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Modules\\Docker\\Tests\\": "tests/"
|
||||
}
|
||||
}
|
||||
}
|
0
web/Modules/Docker/config/.gitkeep
Normal file
0
web/Modules/Docker/config/.gitkeep
Normal file
5
web/Modules/Docker/config/config.php
Normal file
5
web/Modules/Docker/config/config.php
Normal file
|
@ -0,0 +1,5 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'name' => 'Docker',
|
||||
];
|
11
web/Modules/Docker/module.json
Normal file
11
web/Modules/Docker/module.json
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"name": "Docker",
|
||||
"alias": "docker",
|
||||
"description": "",
|
||||
"keywords": [],
|
||||
"priority": 0,
|
||||
"providers": [
|
||||
"Modules\\Docker\\App\\Providers\\DockerServiceProvider"
|
||||
],
|
||||
"files": []
|
||||
}
|
15
web/Modules/Docker/package.json
Normal file
15
web/Modules/Docker/package.json
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build"
|
||||
},
|
||||
"devDependencies": {
|
||||
"axios": "^1.1.2",
|
||||
"laravel-vite-plugin": "^0.7.5",
|
||||
"sass": "^1.69.5",
|
||||
"postcss": "^8.3.7",
|
||||
"vite": "^4.0.0"
|
||||
}
|
||||
}
|
2
web/Modules/Docker/resources/assets/docker-svg/logo.svg
Normal file
2
web/Modules/Docker/resources/assets/docker-svg/logo.svg
Normal file
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg fill="currentColor" width="800px" height="800px" viewBox="0 0 24 24" role="img" xmlns="http://www.w3.org/2000/svg"><path d="M13.983 11.078h2.119a.186.186 0 0 0 .186-.185V9.006a.186.186 0 0 0-.186-.186h-2.119a.185.185 0 0 0-.185.185v1.888c0 .102.083.185.185.185m-2.954-5.43h2.118a.186.186 0 0 0 .186-.186V3.574a.186.186 0 0 0-.186-.185h-2.118a.185.185 0 0 0-.185.185v1.888c0 .102.082.185.185.185m0 2.716h2.118a.187.187 0 0 0 .186-.186V6.29a.186.186 0 0 0-.186-.185h-2.118a.185.185 0 0 0-.185.185v1.887c0 .102.082.185.185.186m-2.93 0h2.12a.186.186 0 0 0 .184-.186V6.29a.185.185 0 0 0-.185-.185H8.1a.185.185 0 0 0-.185.185v1.887c0 .102.083.185.185.186m-2.964 0h2.119a.186.186 0 0 0 .185-.186V6.29a.185.185 0 0 0-.185-.185H5.136a.186.186 0 0 0-.186.185v1.887c0 .102.084.185.186.186m5.893 2.715h2.118a.186.186 0 0 0 .186-.185V9.006a.186.186 0 0 0-.186-.186h-2.118a.185.185 0 0 0-.185.185v1.888c0 .102.082.185.185.185m-2.93 0h2.12a.185.185 0 0 0 .184-.185V9.006a.185.185 0 0 0-.184-.186h-2.12a.185.185 0 0 0-.184.185v1.888c0 .102.083.185.185.185m-2.964 0h2.119a.185.185 0 0 0 .185-.185V9.006a.185.185 0 0 0-.184-.186h-2.12a.186.186 0 0 0-.186.186v1.887c0 .102.084.185.186.185m-2.92 0h2.12a.185.185 0 0 0 .184-.185V9.006a.185.185 0 0 0-.184-.186h-2.12a.185.185 0 0 0-.184.185v1.888c0 .102.082.185.185.185M23.763 9.89c-.065-.051-.672-.51-1.954-.51-.338.001-.676.03-1.01.087-.248-1.7-1.653-2.53-1.716-2.566l-.344-.199-.226.327c-.284.438-.49.922-.612 1.43-.23.97-.09 1.882.403 2.661-.595.332-1.55.413-1.744.42H.751a.751.751 0 0 0-.75.748 11.376 11.376 0 0 0 .692 4.062c.545 1.428 1.355 2.48 2.41 3.124 1.18.723 3.1 1.137 5.275 1.137a15.74 15.74 0 0 0 2.93-.266 12.248 12.248 0 0 0 3.823-1.389 10.51 10.51 0 0 0 2.61-2.136c1.252-1.418 1.998-2.997 2.553-4.4h.221c1.372 0 2.215-.549 2.68-1.009.309-.293.55-.65.707-1.046l.098-.288z"/></svg>
|
After Width: | Height: | Size: 1.9 KiB |
0
web/Modules/Docker/resources/assets/js/app.js
Normal file
0
web/Modules/Docker/resources/assets/js/app.js
Normal file
0
web/Modules/Docker/resources/assets/sass/app.scss
Normal file
0
web/Modules/Docker/resources/assets/sass/app.scss
Normal file
0
web/Modules/Docker/resources/views/.gitkeep
Normal file
0
web/Modules/Docker/resources/views/.gitkeep
Normal file
|
@ -0,0 +1,7 @@
|
|||
<div>
|
||||
{{ $getAction('stop') }}
|
||||
{{ $getAction('start') }}
|
||||
{{ $getAction('restart') }}
|
||||
{{ $getAction('recreate') }}
|
||||
{{ $getAction('delete') }}
|
||||
</div>
|
|
@ -0,0 +1,5 @@
|
|||
<div>
|
||||
<div class="bg-black/5 p-4 rounded">
|
||||
{!! $this->containerLog !!}
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,203 @@
|
|||
<div xmlns:x-filament="http://www.w3.org/1999/html">
|
||||
|
||||
<div class=" mt-6">
|
||||
<x-filament::breadcrumbs :breadcrumbs="[
|
||||
'/' => 'Home',
|
||||
'/admin/docker' => 'Docker',
|
||||
]" />
|
||||
</div>
|
||||
|
||||
@if (!empty($dockerContainers))
|
||||
<div class="mt-6">
|
||||
<div class="text-xl">Your Containers</div>
|
||||
<div class="grid sm:grid-cols-2 gap-6 my-6">
|
||||
@foreach($dockerContainers as $dockerContainer)
|
||||
<div class="rounded-xl bg-white shadow-sm ring-1 ring-gray-950/5 dark:bg-gray-900 dark:ring-white/10">
|
||||
<div class="flex items-center gap-2 px-6 py-2 rounded-t-xl bg-black/5">
|
||||
<div>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-8" viewBox="0 0 32 32">
|
||||
<path fill="#0096e6" d="M16.54 12.663h2.86v2.924h1.446a6.272 6.272 0 0 0 1.988-.333a5.091 5.091 0 0 0 .966-.436a3.584 3.584 0 0 1-.67-1.849a3.907 3.907 0 0 1 .7-2.753l.3-.348l.358.288a4.558 4.558 0 0 1 1.795 2.892a4.375 4.375 0 0 1 3.319.309l.393.226l-.207.4a4.141 4.141 0 0 1-4.157 1.983c-2.48 6.168-7.871 9.088-14.409 9.088c-3.378 0-6.476-1.263-8.241-4.259l-.029-.049l-.252-.519a8.316 8.316 0 0 1-.659-4.208l.04-.433h2.445v-2.923h2.861V9.8h5.721V6.942h3.432z"></path>
|
||||
<path fill="#fff" d="M12.006 24.567a6.022 6.022 0 0 1-3.14-3.089a10.329 10.329 0 0 1-2.264.343q-.5.028-1.045.028q-.632 0-1.331-.037a9.051 9.051 0 0 0 7 2.769q.392 0 .78-.014M7.08 13.346h.2v2.067h-.2Zm-.376 0h.2v2.067H6.7v-2.067Zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.368 0h.2v2.067h-.2zM5 13.14h2.482v2.479H5Zm2.859-2.861h2.48v2.479H7.863Zm2.077.207h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2zm-.376 0h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.368 0h.2v2.066h-.2Zm-.207 2.653h2.48v2.48H7.863V13.14Zm2.077.207h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.368 0h.2v2.067h-.2Zm2.654-.207H13.2v2.48h-2.48V13.14Zm2.076.207H13v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.368 0h.2v2.067h-.2Zm-.206-3.067H13.2v2.479h-2.48v-2.479Zm2.076.207H13v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.368 0h.2v2.066h-.2Zm2.654 2.653h2.479v2.48h-2.48V13.14Zm2.076.207h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.368 0h.192v2.067h-.2v-2.067Zm-.206-3.067h2.479v2.479h-2.48zm2.076.207h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.368 0h.192v2.066h-.2v-2.066Zm-.206-3.067h2.479V9.9h-2.48zm2.076.206h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.376 0h.2v2.066h-.2Zm-.368 0h.192v2.066h-.2V7.625Zm2.654 5.514h2.479v2.48h-2.48V13.14Zm2.076.207h.195v2.067h-.2v-2.067Zm-.376 0h.206v2.067h-.206Zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.2Zm-.376 0h.2v2.067h-.205v-2.067Zm-.368 0h.2v2.067h-.194v-2.067Zm-6.442 6.292a.684.684 0 1 1-.684.684a.684.684 0 0 1 .684-.684m0 .194a.489.489 0 0 1 .177.033a.2.2 0 1 0 .275.269a.49.49 0 1 1-.453-.3Z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="font-extralight text-xl">
|
||||
{{ $dockerContainer['name'] }} #{{ $dockerContainer['id']}}
|
||||
</div>
|
||||
<div>
|
||||
@if($dockerContainer['state'] == 'running')
|
||||
<x-filament::badge color="success">
|
||||
Running
|
||||
</x-filament::badge>
|
||||
@else
|
||||
<x-filament::badge color="danger">
|
||||
Stopped
|
||||
</x-filament::badge>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<div>
|
||||
Image: {{ $dockerContainer['image'] }}
|
||||
</div>
|
||||
@if (!empty($dockerContainer['port']))
|
||||
<div>
|
||||
Ports: {{ $dockerContainer['port'] }} -> {{ $dockerContainer['external_port'] }}
|
||||
</div>
|
||||
@endif
|
||||
@if (!empty($dockerContainer['status']))
|
||||
<div>
|
||||
Status: {{ $dockerContainer['status'] }}
|
||||
</div>
|
||||
@endif
|
||||
<div class="flex gap-3 mt-4">
|
||||
<x-filament::button id="stop-docker-container-{{ $dockerContainer['id'] }}" wire:click="stopDockerContainer('{{ $dockerContainer['id'] }}')" size="xs">
|
||||
Stop
|
||||
</x-filament::button>
|
||||
<x-filament::button id="restart-docker-container-{{ $dockerContainer['id'] }}" wire:click="restartDockerContainer('{{ $dockerContainer['id'] }}')" size="xs">
|
||||
Restart
|
||||
</x-filament::button>
|
||||
<x-filament::button id="remove-docker-container-{{ $dockerContainer['id'] }}" wire:click="removeDockerContainer('{{ $dockerContainer['id'] }}')" size="xs" color="danger">
|
||||
Remove
|
||||
</x-filament::button>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<hr />
|
||||
</div>
|
||||
<div class="flex justify-between mt-4">
|
||||
<x-filament::button id="docker-container-details-{{ $dockerContainer['id'] }}"
|
||||
|
||||
tag="a"
|
||||
href="{{route('filament.admin.docker.resources.docker-containers.view', $dockerContainer['id'])}}"
|
||||
|
||||
size="md" outlined>
|
||||
<div class="flex gap-2 items-center">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-6" viewBox="0 0 24 24">
|
||||
<path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m1 15h-2v-6h2zm0-8h-2V7h2z"></path>
|
||||
</svg>
|
||||
Details
|
||||
</div>
|
||||
</x-filament::button>
|
||||
<x-filament::button id="docker-container-logs-{{ $dockerContainer['id'] }}"
|
||||
tag="a"
|
||||
href="{{route('filament.admin.docker.resources.docker-containers.view', $dockerContainer['id'])}}"
|
||||
size="md" outlined>
|
||||
<div class="flex gap-2 items-center">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-6" viewBox="0 0 15 15">
|
||||
<path fill="currentColor" d="M4.5 6.995H4v1h.5zm6 1h.5v-1h-.5zm-6 1.998H4v1h.5zm6 1.007h.5v-1h-.5zm-6-7.003H4v1h.5zM8.5 5H9V4h-.5zm2-4.5l.354-.354L10.707 0H10.5zm3 3h.5v-.207l-.146-.147zm-9 4.495h6v-1h-6zm0 2.998l6 .007v-1l-6-.007zm0-5.996L8.5 5V4l-4-.003zm8 9.003h-10v1h10zM2 13.5v-12H1v12zM2.5 1h8V0h-8zM13 3.5v10h1v-10zM10.146.854l3 3l.708-.708l-3-3zM2.5 14a.5.5 0 0 1-.5-.5H1A1.5 1.5 0 0 0 2.5 15zm10 1a1.5 1.5 0 0 0 1.5-1.5h-1a.5.5 0 0 1-.5.5zM2 1.5a.5.5 0 0 1 .5-.5V0A1.5 1.5 0 0 0 1 1.5z"></path>
|
||||
</svg>
|
||||
Logs
|
||||
</div>
|
||||
</x-filament::button>
|
||||
<x-filament::button id="docker-container-settings-{{ $dockerContainer['id'] }}"
|
||||
|
||||
tag="a"
|
||||
href="{{route('filament.admin.docker.resources.docker-containers.edit', $dockerContainer['id'])}}"
|
||||
|
||||
size="md" outlined>
|
||||
<div class="flex gap-2 items-center">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-6" viewBox="0 0 16 16">
|
||||
<path fill="currentColor" d="M2.267 6.153A6 6 0 0 1 3.53 3.98a.36.36 0 0 1 .382-.095l1.36.484a.71.71 0 0 0 .935-.538l.26-1.416a.35.35 0 0 1 .274-.282a6.1 6.1 0 0 1 2.52 0c.14.03.248.141.274.282l.26 1.416a.708.708 0 0 0 .935.538l1.36-.484a.36.36 0 0 1 .382.095a6 6 0 0 1 1.262 2.173a.35.35 0 0 1-.108.378l-1.102.931a.703.703 0 0 0 0 1.076l1.102.931c.11.093.152.242.108.378a6 6 0 0 1-1.262 2.173a.36.36 0 0 1-.382.095l-1.36-.484a.71.71 0 0 0-.935.538l-.26 1.416a.35.35 0 0 1-.275.282a6.1 6.1 0 0 1-2.519 0a.35.35 0 0 1-.275-.282l-.259-1.416a.708.708 0 0 0-.935-.538l-1.36.484a.36.36 0 0 1-.382-.095a6 6 0 0 1-1.262-2.173a.35.35 0 0 1 .108-.378l1.102-.931a.704.704 0 0 0 0-1.076l-1.102-.931a.35.35 0 0 1-.108-.378M6.25 8a1.75 1.75 0 1 0 3.5 0a1.75 1.75 0 0 0-3.5 0"></path>
|
||||
</svg>
|
||||
Settings
|
||||
</div>
|
||||
</x-filament::button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="mt-6">
|
||||
<div class="text-xl mb-2">Docker Image Catalog</div>
|
||||
{{ $this->form }}
|
||||
</div>
|
||||
|
||||
<x-filament::modal width="4xl" id="pull-docker-image">
|
||||
|
||||
<x-filament::modal.heading>
|
||||
Pull Docker Image
|
||||
</x-filament::modal.heading>
|
||||
|
||||
<x-filament::modal.description>
|
||||
<div class="">
|
||||
@if ($this->pullLogPulling)
|
||||
<div class="w-full">
|
||||
<div id="js-pull-log" wire:poll="getPullLog"
|
||||
class="text-left text-sm font-medium text-gray-950 dark:text-yellow-500 h-[20rem] overflow-y-scroll">
|
||||
{!! $this->pullLog !!}
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.setInterval(function() {
|
||||
var elem = document.getElementById('js-pull-log');
|
||||
elem.scrollTop = elem.scrollHeight;
|
||||
}, 2000);
|
||||
</script>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</x-filament::modal.description>
|
||||
|
||||
</x-filament::modal>
|
||||
|
||||
<div class="grid sm:grid-cols-2 gap-6 my-6">
|
||||
@foreach($dockerImages as $dockerImage)
|
||||
<div class="sm:flex gap-2 p-6 rounded-xl bg-white shadow-sm ring-1 ring-gray-950/5 dark:bg-gray-900 dark:ring-white/10">
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<div>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-[6rem]" viewBox="0 0 32 32">
|
||||
<path fill="#3a4e55" d="M18.191 13.071H20.7v2.566h1.27a5.5 5.5 0 0 0 1.744-.292a4.462 4.462 0 0 0 .848-.383a3.149 3.149 0 0 1-.589-1.623a3.427 3.427 0 0 1 .616-2.416l.264-.305l.314.253a4 4 0 0 1 1.575 2.538a3.837 3.837 0 0 1 2.913.271l.345.2l-.181.354a3.629 3.629 0 0 1-3.648 1.74c-2.173 5.413-6.9 7.976-12.642 7.976A7.958 7.958 0 0 1 6.3 20.211l-.025-.043l-.226-.459a7.28 7.28 0 0 1-.579-3.693l.035-.38h2.143v-2.565h2.51v-2.51h5.02v-2.51h3.012v5.02Z"></path>
|
||||
<path fill="#00aada" d="M26.324 14.021a3.311 3.311 0 0 0-1.418-2.821a3.072 3.072 0 0 0 .289 3.821a5.279 5.279 0 0 1-3.225 1.037H5.883a6.779 6.779 0 0 0 .667 3.737l.183.335a6.2 6.2 0 0 0 .379.569q.992.064 1.829.045a8.972 8.972 0 0 0 2.669-.389a.193.193 0 1 1 .126.365c-.09.031-.184.061-.281.088a8.4 8.4 0 0 1-1.845.3c.044 0-.046.007-.046.007l-.082.007a21.455 21.455 0 0 1-2.008-.006l-.01.007a7.882 7.882 0 0 0 6.063 2.41c5.56 0 10.276-2.465 12.365-8c1.482.152 2.906-.226 3.553-1.49a3.5 3.5 0 0 0-3.122-.022"></path>
|
||||
<path fill="#27b9ec" d="M26.324 14.021a3.311 3.311 0 0 0-1.418-2.821a3.072 3.072 0 0 0 .289 3.821a5.279 5.279 0 0 1-3.225 1.037H6.836a5.223 5.223 0 0 0 2.106 4.686a8.972 8.972 0 0 0 2.669-.389a.193.193 0 1 1 .126.365c-.09.031-.184.061-.281.088a8.83 8.83 0 0 1-1.894.314l-.019-.022c1.892.971 4.636.967 7.782-.241a21.868 21.868 0 0 0 9.1-6.889l-.1.048"></path>
|
||||
<path fill="#088cb9" d="M5.913 17.732a6.431 6.431 0 0 0 .637 2.061l.183.335a6.2 6.2 0 0 0 .379.569q.992.064 1.829.045a8.972 8.972 0 0 0 2.669-.389a.193.193 0 1 1 .126.365c-.09.031-.184.061-.281.088a8.826 8.826 0 0 1-1.891.307h-.1c-.291.016-.6.026-.922.026c-.351 0-.709-.007-1.1-.026a7.913 7.913 0 0 0 6.076 2.413c4.76 0 8.9-1.807 11.3-5.8Z"></path>
|
||||
<path fill="#039cc7" d="M6.98 17.732a4.832 4.832 0 0 0 1.961 3.01a8.972 8.972 0 0 0 2.669-.389a.193.193 0 1 1 .126.365c-.09.031-.184.061-.281.088a8.959 8.959 0 0 1-1.9.307c1.892.971 4.628.957 7.773-.252a20.545 20.545 0 0 0 5.377-3.13Z"></path>
|
||||
<path fill="#00acd3" d="M9.889 13.671h.172v1.813h-.172zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813H9.23v-1.813Zm-.33 0h.179v1.813H8.9v-1.813Zm-.33 0h.179v1.813H8.57zm-.323 0h.172v1.813h-.17v-1.813Zm-.181-.181h2.175v2.176H8.066V13.49Zm4.335-2.329h.172v1.813H12.4zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.33 0h.178v1.813h-.178zm-.323 0h.172v1.813h-.172zm-.181-.181h2.176v2.176h-2.175z"></path>
|
||||
<path fill="#26c2ee" d="M12.4 13.671h.172v1.813H12.4zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.33 0h.178v1.813h-.178zm-.323 0h.172v1.813h-.172zm-.181-.181h2.176v2.176h-2.175z"></path>
|
||||
<path fill="#00acd3" d="M14.909 13.671h.172v1.813h-.172zm-.33 0h.179v1.813h-.178zm-.33 0h.179v1.813h-.178zm-.33 0h.181v1.813h-.179v-1.813Zm-.33 0h.179v1.813h-.179zm-.323 0h.172v1.813h-.172zm-.181-.181h2.176v2.176h-2.174V13.49Z"></path>
|
||||
<path fill="#26c2ee" d="M14.909 11.161h.172v1.813h-.172zm-.33 0h.179v1.813h-.178zm-.33 0h.179v1.813h-.178zm-.33 0h.181v1.813h-.179v-1.813Zm-.33 0h.179v1.813h-.179zm-.323 0h.172v1.813h-.172zm-.181-.181h2.176v2.176h-2.174v-2.177Zm4.335 2.691h.172v1.813h-.172zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813H16.1zm-.323 0h.172v1.813h-.172zm-.177-.181h2.176v2.176H15.6z"></path>
|
||||
<path fill="#00acd3" d="M17.42 11.161h.172v1.813h-.172zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813H16.1zm-.323 0h.172v1.813h-.172zm-.181-.181h2.176v2.176H15.6v-2.177Z"></path>
|
||||
<path fill="#26c2ee" d="M17.42 8.65h.172v1.813h-.172zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813H16.1zm-.323 0h.172v1.813h-.172zm-.177-.181h2.176v2.176H15.6z"></path>
|
||||
<path fill="#00acd3" d="M19.93 13.671h.17v1.813h-.17zm-.33 0h.178v1.813H19.6zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.33 0h.179v1.813h-.179zm-.323 0h.172v1.813h-.172zm-.181-.181h2.176v2.176h-2.175z"></path>
|
||||
<path fill="#d5eef2" d="M12.616 19.193a.6.6 0 1 1-.6.6a.6.6 0 0 1 .6-.6"></path>
|
||||
<path fill="#3a4e55" d="M12.616 19.363a.431.431 0 0 1 .156.029a.175.175 0 1 0 .241.236a.43.43 0 1 1-.4-.265M2 17.949h27.92c-.608-.154-1.923-.362-1.707-1.159c-1.105 1.279-3.771.9-4.444.267c-.749 1.087-5.111.674-5.415-.173c-.939 1.1-3.85 1.1-4.789 0c-.3.847-4.666 1.26-5.415.173c-.673.631-3.338 1.012-4.444-.267c.217.8-1.1 1.005-1.707 1.159"></path>
|
||||
<path fill="#c0dbe1" d="M14.211 23.518a5.287 5.287 0 0 1-2.756-2.711a9.2 9.2 0 0 1-1.987.3q-.436.024-.917.025q-.554 0-1.168-.033a7.942 7.942 0 0 0 6.145 2.43q.344 0 .683-.013"></path>
|
||||
<path fill="#d5eef2" d="M12.007 21.773a5.206 5.206 0 0 1-.552-.966a9.2 9.2 0 0 1-1.987.3a6.325 6.325 0 0 0 2.539.664"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div class="w-full flex flex-col justify-center">
|
||||
<div class="text-lg font-semibold">
|
||||
{{ $dockerImage['name'] }}
|
||||
</div>
|
||||
<div class="text-sm mt-2">
|
||||
{{ $dockerImage['description'] }}
|
||||
</div>
|
||||
<div class="flex justify-between items-center mt-4">
|
||||
<div class="flex gap-2">
|
||||
@if($dockerImage['is_official'])
|
||||
<x-filament::badge color="success">
|
||||
Official
|
||||
</x-filament::badge>
|
||||
@else
|
||||
<x-filament::badge color="info">
|
||||
Community
|
||||
</x-filament::badge>
|
||||
@endif
|
||||
<x-filament::badge color="warning">
|
||||
{{ $dockerImage['star_count'] }} Stars
|
||||
</x-filament::badge>
|
||||
</div>
|
||||
<div>
|
||||
<x-filament::button wire:key="docker-image-{{$dockerImage['id']}}" wire:click="pullDockerImage('{{ $dockerImage['name'] }}')" class="bg-blue-500/90 text-white">
|
||||
Run
|
||||
</x-filament::button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
</div>
|
7
web/Modules/Docker/resources/views/index.blade.php
Normal file
7
web/Modules/Docker/resources/views/index.blade.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
@extends('docker::layouts.master')
|
||||
|
||||
@section('content')
|
||||
<h1>Hello World</h1>
|
||||
|
||||
<p>Module: {!! config('docker.name') !!}</p>
|
||||
@endsection
|
29
web/Modules/Docker/resources/views/layouts/master.blade.php
Normal file
29
web/Modules/Docker/resources/views/layouts/master.blade.php
Normal file
|
@ -0,0 +1,29 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
|
||||
<title>Docker Module - {{ config('app.name', 'Laravel') }}</title>
|
||||
|
||||
<meta name="description" content="{{ $description ?? '' }}">
|
||||
<meta name="keywords" content="{{ $keywords ?? '' }}">
|
||||
<meta name="author" content="{{ $author ?? '' }}">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="preconnect" href="https://fonts.bunny.net">
|
||||
<link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />
|
||||
|
||||
{{-- Vite CSS --}}
|
||||
{{-- {{ module_vite('build-docker', 'resources/assets/sass/app.scss') }} --}}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@yield('content')
|
||||
|
||||
{{-- Vite JS --}}
|
||||
{{-- {{ module_vite('build-docker', 'resources/assets/js/app.js') }} --}}
|
||||
</body>
|
0
web/Modules/Docker/routes/.gitkeep
Normal file
0
web/Modules/Docker/routes/.gitkeep
Normal file
19
web/Modules/Docker/routes/api.php
Normal file
19
web/Modules/Docker/routes/api.php
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| API Routes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here is where you can register API routes for your application. These
|
||||
| routes are loaded by the RouteServiceProvider within a group which
|
||||
| is assigned the "api" middleware group. Enjoy building your API!
|
||||
|
|
||||
*/
|
||||
|
||||
Route::middleware(['auth:sanctum'])->prefix('v1')->name('api.')->group(function () {
|
||||
Route::get('docker', fn (Request $request) => $request->user())->name('docker');
|
||||
});
|
19
web/Modules/Docker/routes/web.php
Normal file
19
web/Modules/Docker/routes/web.php
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Modules\Docker\App\Http\Controllers\DockerController;
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Web Routes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here is where you can register web routes for your application. These
|
||||
| routes are loaded by the RouteServiceProvider within a group which
|
||||
| contains the "web" middleware group. Now create something great!
|
||||
|
|
||||
*/
|
||||
|
||||
Route::group([], function () {
|
||||
Route::resource('docker', DockerController::class)->names('docker');
|
||||
});
|
14
web/Modules/Docker/shell-scripts/install-docker.sh
Normal file
14
web/Modules/Docker/shell-scripts/install-docker.sh
Normal file
|
@ -0,0 +1,14 @@
|
|||
sudo apt-get update
|
||||
sudo apt-get install ca-certificates curl
|
||||
sudo install -m 0755 -d /etc/apt/keyrings
|
||||
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
|
||||
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
||||
|
||||
# Add the repository to Apt sources:
|
||||
echo \
|
||||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
||||
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
||||
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
sudo apt-get update
|
||||
|
||||
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
26
web/Modules/Docker/vite.config.js
Normal file
26
web/Modules/Docker/vite.config.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
import { defineConfig } from 'vite';
|
||||
import laravel from 'laravel-vite-plugin';
|
||||
|
||||
export default defineConfig({
|
||||
build: {
|
||||
outDir: '../../public/build-docker',
|
||||
emptyOutDir: true,
|
||||
manifest: true,
|
||||
},
|
||||
plugins: [
|
||||
laravel({
|
||||
publicDirectory: '../../public',
|
||||
buildDirectory: 'build-docker',
|
||||
input: [
|
||||
__dirname + '/resources/assets/sass/app.scss',
|
||||
__dirname + '/resources/assets/js/app.js'
|
||||
],
|
||||
refresh: true,
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
//export const paths = [
|
||||
// 'Modules/$STUDLY_NAME$/resources/assets/sass/app.scss',
|
||||
// 'Modules/$STUDLY_NAME$/resources/assets/js/app.js',
|
||||
//];
|
BIN
web/Modules/LetsEncrypt/Actions/acmephp.phar
Normal file
BIN
web/Modules/LetsEncrypt/Actions/acmephp.phar
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue