Compare commits
36 Commits
Author | SHA1 | Date | |
---|---|---|---|
6288935884 | |||
c5e2e7e1e2 | |||
e9d4e5579e | |||
5d2761bc92 | |||
43b9515b61 | |||
a94f08920a | |||
b52dcd4a19 | |||
4c8e09526d | |||
a80ef301a9 | |||
fbc71b5a22 | |||
ad5883cdfd | |||
f9fe45cb75 | |||
a8120a1c46 | |||
6c55f47fd4 | |||
f1cd4bb0e2 | |||
53146df5d6 | |||
14f6dffe99 | |||
721e04370f | |||
b569765f82 | |||
1c9596dd80 | |||
c59dea3745 | |||
460b24f7ee | |||
2fc3919598 | |||
978dd425b9 | |||
1b8726458f | |||
3557f508d0 | |||
1ce802f2cc | |||
f0eda43906 | |||
343a950adc | |||
0218ef6b9f | |||
33e8e91e49 | |||
e78b3ff799 | |||
13bdfa119d | |||
0eea7a639a | |||
f2db21f339 | |||
b10108a9b5 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,3 @@
|
|||||||
.idea
|
.idea
|
||||||
/logs
|
/logs
|
||||||
/data
|
/data
|
||||||
.env
|
|
||||||
|
@ -469,7 +469,7 @@ composer create-project laravel/laravel my-cool-app "5.2.*"
|
|||||||
系统默认LaraDock假定Laravel应用在LaraDock的父级目录中
|
系统默认LaraDock假定Laravel应用在LaraDock的父级目录中
|
||||||
By default LaraDock assumes the Laravel application is living in the parent directory of the laradock folder.
|
By default LaraDock assumes the Laravel application is living in the parent directory of the laradock folder.
|
||||||
|
|
||||||
自新Laravel应用在 `my-cool-app` 目录中, 我们需要用 `../my-cool-app/:/var/www`替换 `../:/var/www` , 如下:
|
更新Laravel应用在 `my-cool-app` 目录中, 我们需要用 `../my-cool-app/:/var/www`替换 `../:/var/www` , 如下:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
application:
|
application:
|
||||||
|
@ -25,6 +25,9 @@ services:
|
|||||||
- INSTALL_V8JS_EXTENSION=false
|
- INSTALL_V8JS_EXTENSION=false
|
||||||
- COMPOSER_GLOBAL_INSTALL=false
|
- COMPOSER_GLOBAL_INSTALL=false
|
||||||
- INSTALL_WORKSPACE_SSH=false
|
- INSTALL_WORKSPACE_SSH=false
|
||||||
|
- INSTALL_LARAVEL_ENVOY=false
|
||||||
|
- INSTALL_DEPLOYER=false
|
||||||
|
- INSTALL_LINUXBREW=false
|
||||||
- PUID=1000
|
- PUID=1000
|
||||||
- PGID=1000
|
- PGID=1000
|
||||||
- NODE_VERSION=stable
|
- NODE_VERSION=stable
|
||||||
@ -49,9 +52,11 @@ services:
|
|||||||
- INSTALL_SOAP=false
|
- INSTALL_SOAP=false
|
||||||
- INSTALL_MONGO=false
|
- INSTALL_MONGO=false
|
||||||
- INSTALL_ZIP_ARCHIVE=false
|
- INSTALL_ZIP_ARCHIVE=false
|
||||||
- INSTALL_BCMATH=true
|
- INSTALL_BCMATH=false
|
||||||
|
- INSTALL_PHPREDIS=false
|
||||||
- INSTALL_MEMCACHED=false
|
- INSTALL_MEMCACHED=false
|
||||||
- INSTALL_OPCACHE=false
|
- INSTALL_OPCACHE=false
|
||||||
|
- INSTALL_EXIF=false
|
||||||
- INSTALL_AEROSPIKE_EXTENSION=false
|
- INSTALL_AEROSPIKE_EXTENSION=false
|
||||||
- CODEIGNITER=false
|
- CODEIGNITER=false
|
||||||
dockerfile: Dockerfile-70
|
dockerfile: Dockerfile-70
|
||||||
@ -117,7 +122,7 @@ services:
|
|||||||
### MySQL Container #########################################
|
### MySQL Container #########################################
|
||||||
|
|
||||||
mysql:
|
mysql:
|
||||||
build:
|
build:
|
||||||
context: ./mysql
|
context: ./mysql
|
||||||
args:
|
args:
|
||||||
- MYSQL_DATABASE=homestead
|
- MYSQL_DATABASE=homestead
|
||||||
@ -134,7 +139,7 @@ services:
|
|||||||
mariadb:
|
mariadb:
|
||||||
build: ./mariadb
|
build: ./mariadb
|
||||||
volumes:
|
volumes:
|
||||||
- mysql:/var/lib/mysql
|
- mariadb:/var/lib/mysql
|
||||||
ports:
|
ports:
|
||||||
- "3306:3306"
|
- "3306:3306"
|
||||||
environment:
|
environment:
|
||||||
@ -190,6 +195,15 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- mongo:/data/db
|
- mongo:/data/db
|
||||||
|
|
||||||
|
### RethinkDB Container #######################################
|
||||||
|
|
||||||
|
rethinkdb:
|
||||||
|
build: ./rethinkdb
|
||||||
|
ports:
|
||||||
|
- "8090:8080"
|
||||||
|
volumes:
|
||||||
|
- rethinkdb:/data/rethinkdb_data
|
||||||
|
|
||||||
### Redis Container #########################################
|
### Redis Container #########################################
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
@ -314,6 +328,13 @@ services:
|
|||||||
links:
|
links:
|
||||||
- php-fpm
|
- php-fpm
|
||||||
|
|
||||||
|
### Selenium Container #########################################
|
||||||
|
|
||||||
|
selenium:
|
||||||
|
build: ./selenium
|
||||||
|
ports:
|
||||||
|
- "4444:4444"
|
||||||
|
|
||||||
### Volumes Setup ###########################################
|
### Volumes Setup ###########################################
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
@ -331,6 +352,8 @@ volumes:
|
|||||||
driver: "local"
|
driver: "local"
|
||||||
mongo:
|
mongo:
|
||||||
driver: "local"
|
driver: "local"
|
||||||
|
rethinkdb:
|
||||||
|
driver: "local"
|
||||||
phpmyadmin:
|
phpmyadmin:
|
||||||
driver: "local"
|
driver: "local"
|
||||||
aerospike:
|
aerospike:
|
||||||
|
@ -15,6 +15,8 @@ server {
|
|||||||
try_files $uri /index.php =404;
|
try_files $uri /index.php =404;
|
||||||
fastcgi_pass php-upstream;
|
fastcgi_pass php-upstream;
|
||||||
fastcgi_index index.php;
|
fastcgi_index index.php;
|
||||||
|
fastcgi_buffers 16 16k;
|
||||||
|
fastcgi_buffer_size 32k;
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
include fastcgi_params;
|
include fastcgi_params;
|
||||||
}
|
}
|
||||||
|
@ -60,6 +60,17 @@ RUN if [ ${INSTALL_XDEBUG} = true ]; then \
|
|||||||
docker-php-ext-enable xdebug \
|
docker-php-ext-enable xdebug \
|
||||||
;fi
|
;fi
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
# PHP REDIS EXTENSION FOR PHP 7.0
|
||||||
|
#####################################
|
||||||
|
ARG INSTALL_PHPREDIS=false
|
||||||
|
RUN if [ ${INSTALL_PHPREDIS} = true ]; then \
|
||||||
|
# Install Php Redis Extension
|
||||||
|
pecl install -o -f redis \
|
||||||
|
&& rm -rf /tmp/pear \
|
||||||
|
&& docker-php-ext-enable redis \
|
||||||
|
;fi
|
||||||
|
|
||||||
# Copy xdebug configration for remote debugging
|
# Copy xdebug configration for remote debugging
|
||||||
COPY ./xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
|
COPY ./xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
|
||||||
|
|
||||||
@ -117,6 +128,18 @@ RUN if [ ${INSTALL_MEMCACHED} = true ]; then \
|
|||||||
&& docker-php-ext-enable memcached \
|
&& docker-php-ext-enable memcached \
|
||||||
;fi
|
;fi
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
# Exif:
|
||||||
|
#####################################
|
||||||
|
|
||||||
|
ARG INSTALL_EXIF=false
|
||||||
|
RUN if [ ${INSTALL_EXIF} = true ]; then \
|
||||||
|
# Enable Exif PHP extentions requirements
|
||||||
|
docker-php-ext-install exif && \
|
||||||
|
docker-php-ext-enable exif \
|
||||||
|
;fi
|
||||||
|
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
# PHP Aerospike:
|
# PHP Aerospike:
|
||||||
#####################################
|
#####################################
|
||||||
|
@ -1,62 +0,0 @@
|
|||||||
version: '2'
|
|
||||||
|
|
||||||
services:
|
|
||||||
|
|
||||||
### Workspace Utilities Container ###########################
|
|
||||||
|
|
||||||
workspace:
|
|
||||||
build:
|
|
||||||
context: ./workspace
|
|
||||||
args:
|
|
||||||
- INSTALL_XDEBUG=false
|
|
||||||
- INSTALL_MONGO=false
|
|
||||||
- INSTALL_NODE=false
|
|
||||||
- INSTALL_YARN=false
|
|
||||||
- INSTALL_DRUSH=false
|
|
||||||
- INSTALL_AEROSPIKE_EXTENSION=false
|
|
||||||
- COMPOSER_GLOBAL_INSTALL=false
|
|
||||||
- INSTALL_WORKSPACE_SSH=false
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- NODE_VERSION=stable
|
|
||||||
volumes_from:
|
|
||||||
- volumes_source
|
|
||||||
ports:
|
|
||||||
- "22:22"
|
|
||||||
tty: true
|
|
||||||
|
|
||||||
### PHP-FPM Container #######################################
|
|
||||||
|
|
||||||
php-fpm:
|
|
||||||
build:
|
|
||||||
context: ./php-fpm
|
|
||||||
args:
|
|
||||||
- INSTALL_XDEBUG=false
|
|
||||||
- INSTALL_MONGO=false
|
|
||||||
- INSTALL_ZIP_ARCHIVE=false
|
|
||||||
- INSTALL_MEMCACHED=false
|
|
||||||
- INSTALL_OPCACHE=false
|
|
||||||
- INSTALL_AEROSPIKE_EXTENSION=false
|
|
||||||
dockerfile: Dockerfile-70
|
|
||||||
volumes_from:
|
|
||||||
- volumes_source
|
|
||||||
expose:
|
|
||||||
- "9000"
|
|
||||||
links:
|
|
||||||
- workspace
|
|
||||||
|
|
||||||
### Application Code Container ######################
|
|
||||||
|
|
||||||
volumes_source:
|
|
||||||
image: tianon/true
|
|
||||||
volumes:
|
|
||||||
- ../:/var/www
|
|
||||||
|
|
||||||
### Databases Data Container ################################
|
|
||||||
|
|
||||||
volumes_data:
|
|
||||||
image: tianon/true
|
|
||||||
volumes:
|
|
||||||
# - ./data/mysql:/var/lib/mysql
|
|
||||||
|
|
||||||
### Add All your Software Containers below ###############################
|
|
11
rethinkdb/Dockerfile
Normal file
11
rethinkdb/Dockerfile
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
FROM rethinkdb:latest
|
||||||
|
|
||||||
|
MAINTAINER Cristian Mello <cristianc.mello@gmail.com>
|
||||||
|
|
||||||
|
VOLUME /data/rethinkdb_data
|
||||||
|
|
||||||
|
RUN cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/instance1.conf
|
||||||
|
|
||||||
|
CMD ["rethinkdb", "--bind", "all"]
|
||||||
|
|
||||||
|
EXPOSE 8080
|
5
selenium/Dockerfile
Normal file
5
selenium/Dockerfile
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
FROM selenium/standalone-chrome
|
||||||
|
|
||||||
|
MAINTAINER Edmund Luong <edmundvmluong@gmail.com>
|
||||||
|
|
||||||
|
EXPOSE 4444
|
@ -46,7 +46,7 @@ ARG PUID=1000
|
|||||||
ARG PGID=1000
|
ARG PGID=1000
|
||||||
RUN groupadd -g $PGID laradock && \
|
RUN groupadd -g $PGID laradock && \
|
||||||
useradd -u $PUID -g laradock -m laradock
|
useradd -u $PUID -g laradock -m laradock
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
# Set Timezone
|
# Set Timezone
|
||||||
#####################################
|
#####################################
|
||||||
@ -74,12 +74,34 @@ RUN if [ ${COMPOSER_GLOBAL_INSTALL} = true ]; then \
|
|||||||
composer global install \
|
composer global install \
|
||||||
;fi
|
;fi
|
||||||
|
|
||||||
|
# Export composer vendor path
|
||||||
|
RUN echo "" >> ~/.bashrc && \
|
||||||
|
echo 'export PATH="~/.composer/vendor/bin:$PATH"' >> ~/.bashrc
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
# Crontab
|
# Crontab
|
||||||
#####################################
|
#####################################
|
||||||
USER root
|
USER root
|
||||||
|
|
||||||
COPY ./crontab /var/spool/cron/crontabs
|
COPY ./crontab /etc/cron.d
|
||||||
|
RUN chmod -R 644 /etc/cron.d
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
# User Aliases
|
||||||
|
#####################################
|
||||||
|
|
||||||
|
USER laradock
|
||||||
|
COPY ./aliases.sh /home/laradock/aliases.sh
|
||||||
|
RUN echo "" >> ~/.bashrc && \
|
||||||
|
echo "# Load Custom Aliases" >> ~/.bashrc && \
|
||||||
|
echo "source /home/laradock/aliases.sh" >> ~/.bashrc && \
|
||||||
|
echo "" >> ~/.bashrc
|
||||||
|
|
||||||
|
USER root
|
||||||
|
RUN echo "" >> ~/.bashrc && \
|
||||||
|
echo "# Load Custom Aliases" >> ~/.bashrc && \
|
||||||
|
echo "source /home/laradock/aliases.sh" >> ~/.bashrc && \
|
||||||
|
echo "" >> ~/.bashrc
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
# xDebug:
|
# xDebug:
|
||||||
@ -268,6 +290,73 @@ USER laradock
|
|||||||
RUN echo "" >> ~/.bashrc && \
|
RUN echo "" >> ~/.bashrc && \
|
||||||
echo 'export PATH="/var/www/vendor/bin:$PATH"' >> ~/.bashrc
|
echo 'export PATH="/var/www/vendor/bin:$PATH"' >> ~/.bashrc
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
# Laravel Artisan Alias
|
||||||
|
#####################################
|
||||||
|
USER root
|
||||||
|
|
||||||
|
RUN echo "" >> ~/.bashrc && \
|
||||||
|
echo 'alias art="php artisan"' >> ~/.bashrc
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
# Laravel Envoy:
|
||||||
|
#####################################
|
||||||
|
USER laradock
|
||||||
|
|
||||||
|
ARG INSTALL_LARAVEL_ENVOY=true
|
||||||
|
ENV INSTALL_LARAVEL_ENVOY ${INSTALL_LARAVEL_ENVOY}
|
||||||
|
|
||||||
|
RUN if [ ${INSTALL_LARAVEL_ENVOY} = true ]; then \
|
||||||
|
# Install the Laravel Envoy
|
||||||
|
composer global require "laravel/envoy=~1.0" \
|
||||||
|
;fi
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
# Deployer:
|
||||||
|
#####################################
|
||||||
|
USER laradock
|
||||||
|
|
||||||
|
ARG INSTALL_DEPLOYER=false
|
||||||
|
ENV INSTALL_DEPLOYER ${INSTALL_DEPLOYER}
|
||||||
|
|
||||||
|
RUN if [ ${INSTALL_DEPLOYER} = true ]; then \
|
||||||
|
# Install the Deployer
|
||||||
|
composer global require "deployer/deployer" \
|
||||||
|
;fi
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
# Linuxbrew:
|
||||||
|
#####################################
|
||||||
|
USER root
|
||||||
|
|
||||||
|
ARG INSTALL_LINUXBREW=true
|
||||||
|
ENV INSTALL_LINUXBREW ${INSTALL_LINUXBREW}
|
||||||
|
|
||||||
|
RUN if [ ${INSTALL_LINUXBREW} = true ]; then \
|
||||||
|
|
||||||
|
# Preparation
|
||||||
|
apt-get update && \
|
||||||
|
apt-get upgrade -y && \
|
||||||
|
apt-get install -y build-essential make cmake scons curl git \
|
||||||
|
ruby autoconf automake autoconf-archive \
|
||||||
|
gettext libtool flex bison \
|
||||||
|
libbz2-dev libcurl4-openssl-dev \
|
||||||
|
libexpat-dev libncurses-dev && \
|
||||||
|
|
||||||
|
# Install the Linuxbrew
|
||||||
|
git clone https://github.com/Homebrew/linuxbrew.git ~/.linuxbrew && \
|
||||||
|
|
||||||
|
echo "" >> ~/.bashrc && \
|
||||||
|
echo 'export PKG_CONFIG_PATH"=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:/usr/lib64/pkgconfig:/usr/lib/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib64/pkgconfig:/usr/share/pkgconfig:$PKG_CONFIG_PATH"' >> ~/.bashrc && \
|
||||||
|
|
||||||
|
# Setup linuxbrew
|
||||||
|
echo 'export LINUXBREWHOME="$HOME/.linuxbrew"' >> ~/.bashrc && \
|
||||||
|
echo 'export PATH="$LINUXBREWHOME/bin:$PATH"' >> ~/.bashrc && \
|
||||||
|
echo 'export MANPATH="$LINUXBREWHOME/man:$MANPATH"' >> ~/.bashrc && \
|
||||||
|
echo 'export PKG_CONFIG_PATH="$LINUXBREWHOME/lib64/pkgconfig:$LINUXBREWHOME/lib/pkgconfig:$PKG_CONFIG_PATH"' >> ~/.bashrc && \
|
||||||
|
echo 'export LD_LIBRARY_PATH="$LINUXBREWHOME/lib64:$LINUXBREWHOME/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc \
|
||||||
|
;fi
|
||||||
|
|
||||||
#
|
#
|
||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
# Final Touch
|
# Final Touch
|
||||||
|
71
workspace/aliases.sh
Normal file
71
workspace/aliases.sh
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
# Colors used for status updates
|
||||||
|
ESC_SEQ="\x1b["
|
||||||
|
COL_RESET=$ESC_SEQ"39;49;00m"
|
||||||
|
COL_RED=$ESC_SEQ"31;01m"
|
||||||
|
COL_GREEN=$ESC_SEQ"32;01m"
|
||||||
|
COL_YELLOW=$ESC_SEQ"33;01m"
|
||||||
|
COL_BLUE=$ESC_SEQ"34;01m"
|
||||||
|
COL_MAGENTA=$ESC_SEQ"35;01m"
|
||||||
|
COL_CYAN=$ESC_SEQ"36;01m"
|
||||||
|
|
||||||
|
# Commonly Used Aliases
|
||||||
|
alias ..="cd .."
|
||||||
|
alias c="clear"
|
||||||
|
alias cla="clear && ls -l"
|
||||||
|
alias cll="clear && ls -la"
|
||||||
|
alias cls="clear && ls"
|
||||||
|
alias code="cd /var/www"
|
||||||
|
alias ea="vi ~/aliases"
|
||||||
|
alias g="gulp"
|
||||||
|
alias home="cd ~"
|
||||||
|
alias npm-global="npm list -g --depth 0"
|
||||||
|
alias ra="reload"
|
||||||
|
alias reload="source ~/.aliases && echo \"$COL_GREEN ==> Aliases Reloaded... $COL_RESET \n \""
|
||||||
|
alias run="npm run"
|
||||||
|
alias tree="xtree"
|
||||||
|
|
||||||
|
# Laravel / PHP Alisases
|
||||||
|
alias art="php artisan"
|
||||||
|
alias artisan="php artisan"
|
||||||
|
alias cdump="composer dump-autoload -o"
|
||||||
|
alias composer:dump="composer dump-autoload -o"
|
||||||
|
alias db:reset="php artisan migrate:reset && php artisan migrate --seed"
|
||||||
|
alias migrate="php artisan migrate"
|
||||||
|
alias seed="php artisan:seed"
|
||||||
|
alias phpunit="./vendor/bin/phpunit"
|
||||||
|
|
||||||
|
|
||||||
|
# requires installation of 'https://www.npmjs.com/package/npms-cli'
|
||||||
|
alias npms="npms search"
|
||||||
|
|
||||||
|
# requires installation of 'https://www.npmjs.com/package/package-menu-cli'
|
||||||
|
alias pm="package-menu"
|
||||||
|
|
||||||
|
# requires installation of 'https://www.npmjs.com/package/pkg-version-cli'
|
||||||
|
alias pv="package-version"
|
||||||
|
|
||||||
|
# requires installation of 'https://github.com/sindresorhus/latest-version-cli'
|
||||||
|
alias lv="latest-version"
|
||||||
|
|
||||||
|
# git aliases
|
||||||
|
alias gaa="git add ."
|
||||||
|
alias gd="git --no-pager diff"
|
||||||
|
alias git-revert="git reset --hard && git clean -df"
|
||||||
|
alias gs="git status"
|
||||||
|
alias whoops="git reset --hard && git clean -df"
|
||||||
|
|
||||||
|
|
||||||
|
# Create a new directory and enter it
|
||||||
|
function mkd() {
|
||||||
|
mkdir -p "$@" && cd "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
function md() {
|
||||||
|
mkdir -p "$@" && cd "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
function xtree {
|
||||||
|
find ${1:-.} -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
|
||||||
|
}
|
1
workspace/crontab/laradock
Normal file
1
workspace/crontab/laradock
Normal file
@ -0,0 +1 @@
|
|||||||
|
* * * * * laradock php /var/www/artisan schedule:run >> /dev/null 2>&1
|
@ -1 +0,0 @@
|
|||||||
* * * * * php /var/www/artisan schedule:run >> /dev/null 2>&1
|
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
|
|
||||||
# Grab full name of php-fpm container
|
# Grab full name of php-fpm container
|
||||||
PHP_FPM_CONTAINER=$(docker-compose ps | grep php-fpm | cut -d" " -f 1)
|
PHP_FPM_CONTAINER=$(docker-compose ps | grep php-fpm | cut -d " " -f 1)
|
||||||
|
|
||||||
|
|
||||||
# Grab OS type
|
# Grab OS type
|
||||||
|
Reference in New Issue
Block a user