Compare commits
14 commits
Author | SHA1 | Date | |
---|---|---|---|
b58c283a4b | |||
5805279633 | |||
b61677ebe8 | |||
fc7abd4ba1 | |||
00e96ef7ae | |||
21e2758323 | |||
3d4c3e6e42 | |||
f327088771 | |||
fb578fd670 | |||
ab546d6536 | |||
c842685155 | |||
7241874e5d | |||
41234b34bf | |||
df2d9520ca |
57
.drone.yml
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: default
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
include:
|
||||||
|
- push
|
||||||
|
- cron
|
||||||
|
branch:
|
||||||
|
- master
|
||||||
|
|
||||||
|
environment: &default_environment
|
||||||
|
REVISION: ${DRONE_COMMIT_SHA}
|
||||||
|
CREATED: ${DRONE_BUILD_CREATED}
|
||||||
|
SOURCE_URL: ${DRONE_GIT_HTTP_URL}
|
||||||
|
# also change in 'tags' of build docker
|
||||||
|
TS3WEB_VERSION: 2.2.6
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build docker image
|
||||||
|
image: plugins/docker
|
||||||
|
environment:
|
||||||
|
<<: *default_environment
|
||||||
|
settings:
|
||||||
|
purge: true
|
||||||
|
repo: varakh/ts3web
|
||||||
|
username:
|
||||||
|
from_secret: dockerhub_user
|
||||||
|
password:
|
||||||
|
from_secret: dockerhub_key
|
||||||
|
tags:
|
||||||
|
- latest
|
||||||
|
- 2.2.6
|
||||||
|
|
||||||
|
- name: notify
|
||||||
|
image: drillster/drone-email
|
||||||
|
settings:
|
||||||
|
subject: "Build failed"
|
||||||
|
body: "URL ${DRONE_BUILD_LINK}"
|
||||||
|
host:
|
||||||
|
from_secret: mail_host
|
||||||
|
username:
|
||||||
|
from_secret: mail_user
|
||||||
|
password:
|
||||||
|
from_secret: mail_password
|
||||||
|
from:
|
||||||
|
from_secret: mail_from
|
||||||
|
when:
|
||||||
|
status:
|
||||||
|
- failure
|
||||||
|
---
|
||||||
|
kind: signature
|
||||||
|
hmac: f575a63bd85c4a95593be5e077373216fbd50ad57e6b3d1db56f950e881ed2a5
|
||||||
|
|
||||||
|
...
|
6
.editorconfig
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
40
CHANGELOG.md
|
@ -1,18 +1,41 @@
|
||||||
# CHANGELOG
|
# CHANGELOG
|
||||||
|
|
||||||
|
## 2.2.6 - 2023/04/06
|
||||||
|
|
||||||
|
_Quick update for an outdated application to make it more useful for docker setups. Keep in mind that PHP 7.4 which is used by ts3web is still EOL!_
|
||||||
|
|
||||||
|
* Made it possible to use environment variable to define location of bootstrapping `env` file in docker containers (natively, set php-fpm `ENV[]` properly!)
|
||||||
|
* `ENV_DIR`: location of the **PARENT** folder which has the `env` file inside
|
||||||
|
* Falls back to application `$appDir/config/env` file if not set
|
||||||
|
* Added new `env` file variables to easily configure
|
||||||
|
* `log_dir`: location of the log dir, _without trailing slash_
|
||||||
|
* `snapshot_dir` location of the snapshots dir, _without trailing slash_
|
||||||
|
|
||||||
|
## 2.2.5 - 2022/12/17
|
||||||
|
* Updated `Dockerfile` (as long as alpine 3.15 shipping PHP7 is kept updated, `ts3web` docker images are kept)
|
||||||
|
* Updated some symfony dependencies
|
||||||
|
|
||||||
|
## 2.2.4 - 2022/01/19
|
||||||
|
* Updated dependencies
|
||||||
|
* This application will be EOL once PHP7 is not supported anymore
|
||||||
|
|
||||||
## 2.2.3 - 2021/01/08
|
## 2.2.3 - 2021/01/08
|
||||||
|
|
||||||
* Change docker base to alpine
|
* Change docker base to alpine
|
||||||
|
|
||||||
## 2.2.2 - 2020/03/22
|
## 2.2.2 - 2020/03/22
|
||||||
|
|
||||||
* Stop auto-sorting tables
|
* Stop auto-sorting tables
|
||||||
* Add bandwidth formatter
|
* Add bandwidth formatter
|
||||||
* Check PHP 7.4 compatibility
|
* Check PHP 7.4 compatibility
|
||||||
* Increase docker image base to PHP 7.4
|
* Increase docker image base to PHP 7.4
|
||||||
|
|
||||||
## 2.2.1 - 2019/11/10
|
## 2.2.1 - 2019/11/10
|
||||||
|
|
||||||
* Use separate JavaScript file to initialize DataTables
|
* Use separate JavaScript file to initialize DataTables
|
||||||
|
|
||||||
## 2.2.0 - 2019/11/10
|
## 2.2.0 - 2019/11/10
|
||||||
|
|
||||||
* Add version tag to footer
|
* Add version tag to footer
|
||||||
* Add sortable tables
|
* Add sortable tables
|
||||||
* Add search on tables
|
* Add search on tables
|
||||||
|
@ -21,22 +44,27 @@
|
||||||
* Fix dependency version
|
* Fix dependency version
|
||||||
|
|
||||||
## 2.1.4 - 2019/11/08
|
## 2.1.4 - 2019/11/08
|
||||||
|
|
||||||
* Use autofocus on username input field instead of the password field
|
* Use autofocus on username input field instead of the password field
|
||||||
* Fill missing cells on incorrect cell count in table views when only partial data is available
|
* Fill missing cells on incorrect cell count in table views when only partial data is available
|
||||||
|
|
||||||
## 2.1.3 - 2019/08/08
|
## 2.1.3 - 2019/08/08
|
||||||
|
|
||||||
* Fixed false rendering of forms
|
* Fixed false rendering of forms
|
||||||
* Fixed channel tree view showing the wrong virtual server after selection
|
* Fixed channel tree view showing the wrong virtual server after selection
|
||||||
* Minor code refactor
|
* Minor code refactor
|
||||||
|
|
||||||
## 2.1.2 - 2019/08/07
|
## 2.1.2 - 2019/08/07
|
||||||
|
|
||||||
* Minor refactoring
|
* Minor refactoring
|
||||||
* Update documentation
|
* Update documentation
|
||||||
|
|
||||||
## 2.1.1 - 2019/08/07
|
## 2.1.1 - 2019/08/07
|
||||||
|
|
||||||
* Updated translation
|
* Updated translation
|
||||||
|
|
||||||
## 2.1.0 - 2019/08/07
|
## 2.1.0 - 2019/08/07
|
||||||
|
|
||||||
* Fixed file handling on snapshots
|
* Fixed file handling on snapshots
|
||||||
* Cleaned up template links
|
* Cleaned up template links
|
||||||
* Updated documentation
|
* Updated documentation
|
||||||
|
@ -47,6 +75,7 @@
|
||||||
* Removed about modal
|
* Removed about modal
|
||||||
|
|
||||||
## 2.0.0 - 2019/08/06
|
## 2.0.0 - 2019/08/06
|
||||||
|
|
||||||
* Replace material design with bootstrap4 theme
|
* Replace material design with bootstrap4 theme
|
||||||
* Add an about modal
|
* Add an about modal
|
||||||
* Add tree view for online clients
|
* Add tree view for online clients
|
||||||
|
@ -54,34 +83,45 @@
|
||||||
* Update dependencies and force PHP 7.3
|
* Update dependencies and force PHP 7.3
|
||||||
|
|
||||||
## 1.2.4 - 2019/01/18
|
## 1.2.4 - 2019/01/18
|
||||||
|
|
||||||
* No info text
|
* No info text
|
||||||
|
|
||||||
## 1.2.3 - 2019/01/18
|
## 1.2.3 - 2019/01/18
|
||||||
|
|
||||||
* No info text
|
* No info text
|
||||||
|
|
||||||
## 1.2.2 - 2018/09/01
|
## 1.2.2 - 2018/09/01
|
||||||
|
|
||||||
* No info text
|
* No info text
|
||||||
|
|
||||||
## 1.2.1 - 2018/06/04
|
## 1.2.1 - 2018/06/04
|
||||||
|
|
||||||
* No info text
|
* No info text
|
||||||
|
|
||||||
## 1.2.0 - 2018/06/04
|
## 1.2.0 - 2018/06/04
|
||||||
|
|
||||||
* No info text
|
* No info text
|
||||||
|
|
||||||
## 1.1.1 - 2018/05/04
|
## 1.1.1 - 2018/05/04
|
||||||
|
|
||||||
* No info text
|
* No info text
|
||||||
|
|
||||||
## 1.1.0 - 2018/05/04
|
## 1.1.0 - 2018/05/04
|
||||||
|
|
||||||
* No info text
|
* No info text
|
||||||
|
|
||||||
## 1.0.3 - 2018/04/04
|
## 1.0.3 - 2018/04/04
|
||||||
|
|
||||||
* No info text
|
* No info text
|
||||||
|
|
||||||
## 1.0.2 - 2018/04/04
|
## 1.0.2 - 2018/04/04
|
||||||
|
|
||||||
* No info text
|
* No info text
|
||||||
|
|
||||||
## 1.0.1 - 2018/04/03
|
## 1.0.1 - 2018/04/03
|
||||||
|
|
||||||
* No info text
|
* No info text
|
||||||
|
|
||||||
## 1.0.0 - 2018/04/03
|
## 1.0.0 - 2018/04/03
|
||||||
|
|
||||||
* No info text
|
* No info text
|
33
Dockerfile
|
@ -1,8 +1,12 @@
|
||||||
FROM alpine:3
|
FROM alpine:3.15
|
||||||
|
|
||||||
LABEL maintainer="Varakh<varakh@varakh.de>"
|
LABEL maintainer="Varakh<varakh@varakh.de>"
|
||||||
|
|
||||||
ENV APP_HOME /var/www/html/application
|
ENV APP_HOME=/var/www/html/application \
|
||||||
|
PHP_MEMORY_LIMIT=512M \
|
||||||
|
MAX_UPLOAD=1024M \
|
||||||
|
PHP_MAX_FILE_UPLOAD=200 \
|
||||||
|
PHP_MAX_POST=1024M
|
||||||
|
|
||||||
# setup folder structure
|
# setup folder structure
|
||||||
RUN mkdir -p ${APP_HOME}/data/snapshots && \
|
RUN mkdir -p ${APP_HOME}/data/snapshots && \
|
||||||
|
@ -10,6 +14,9 @@ RUN mkdir -p ${APP_HOME}/data/snapshots && \
|
||||||
touch ${APP_HOME}/log/application.log && \
|
touch ${APP_HOME}/log/application.log && \
|
||||||
mkdir -p ${APP_HOME}/config
|
mkdir -p ${APP_HOME}/config
|
||||||
|
|
||||||
|
# entrypoint
|
||||||
|
ADD docker/configure.php /configure.php
|
||||||
|
|
||||||
# add upstream application
|
# add upstream application
|
||||||
ADD src ${APP_HOME}/src
|
ADD src ${APP_HOME}/src
|
||||||
ADD public ${APP_HOME}/public
|
ADD public ${APP_HOME}/public
|
||||||
|
@ -17,21 +24,15 @@ ADD composer.json ${APP_HOME}/composer.json
|
||||||
ADD composer.lock ${APP_HOME}/composer.lock
|
ADD composer.lock ${APP_HOME}/composer.lock
|
||||||
ADD data ${APP_HOME}/data
|
ADD data ${APP_HOME}/data
|
||||||
ADD config ${APP_HOME}/config
|
ADD config ${APP_HOME}/config
|
||||||
RUN mv ${APP_HOME}/config/env.example ${APP_HOME}/config/env
|
|
||||||
|
|
||||||
# php.ini
|
|
||||||
ENV PHP_MEMORY_LIMIT 512M
|
|
||||||
ENV MAX_UPLOAD 1024M
|
|
||||||
ENV PHP_MAX_FILE_UPLOAD 200
|
|
||||||
ENV PHP_MAX_POST 1024M
|
|
||||||
|
|
||||||
# install dependencies
|
# install dependencies
|
||||||
RUN apk add --update --no-cache \
|
RUN cp ${APP_HOME}/config/env.example ${APP_HOME}/config/env && \
|
||||||
|
apk add --update --no-cache \
|
||||||
|
bash \
|
||||||
nginx \
|
nginx \
|
||||||
s6 \
|
s6 \
|
||||||
curl \
|
curl \
|
||||||
git \
|
git \
|
||||||
composer \
|
|
||||||
php7 \
|
php7 \
|
||||||
php7-fpm \
|
php7-fpm \
|
||||||
php7-cli \
|
php7-cli \
|
||||||
|
@ -50,16 +51,19 @@ RUN apk add --update --no-cache \
|
||||||
php7-mbstring \
|
php7-mbstring \
|
||||||
php7-ctype \
|
php7-ctype \
|
||||||
php7-ldap \
|
php7-ldap \
|
||||||
|
php7-openssl \
|
||||||
php7-pecl-memcached \
|
php7-pecl-memcached \
|
||||||
memcached \
|
memcached \
|
||||||
ca-certificates && \
|
ca-certificates && \
|
||||||
rm -rf /var/cache/apk/* && \
|
rm -rf /var/cache/apk/* && \
|
||||||
apk add gnu-libiconv --update-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ --allow-untrusted && \
|
apk add gnu-libiconv --update-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ --allow-untrusted && \
|
||||||
# set environments
|
# set environments/php
|
||||||
sed -i "s|;*memory_limit =.*|memory_limit = ${PHP_MEMORY_LIMIT}|i" /etc/php7/php.ini && \
|
sed -i "s|;*memory_limit =.*|memory_limit = ${PHP_MEMORY_LIMIT}|i" /etc/php7/php.ini && \
|
||||||
sed -i "s|;*upload_max_filesize =.*|upload_max_filesize = ${MAX_UPLOAD}|i" /etc/php7/php.ini && \
|
sed -i "s|;*upload_max_filesize =.*|upload_max_filesize = ${MAX_UPLOAD}|i" /etc/php7/php.ini && \
|
||||||
sed -i "s|;*max_file_uploads =.*|max_file_uploads = ${PHP_MAX_FILE_UPLOAD}|i" /etc/php7/php.ini && \
|
sed -i "s|;*max_file_uploads =.*|max_file_uploads = ${PHP_MAX_FILE_UPLOAD}|i" /etc/php7/php.ini && \
|
||||||
sed -i "s|;*post_max_size =.*|post_max_size = ${PHP_MAX_POST}|i" /etc/php7/php.ini && \
|
sed -i "s|;*post_max_size =.*|post_max_size = ${PHP_MAX_POST}|i" /etc/php7/php.ini && \
|
||||||
|
# prepare php
|
||||||
|
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
|
||||||
# prepare application
|
# prepare application
|
||||||
cd ${APP_HOME} && composer install && \
|
cd ${APP_HOME} && composer install && \
|
||||||
# clean up and permissions
|
# clean up and permissions
|
||||||
|
@ -69,10 +73,13 @@ RUN apk add --update --no-cache \
|
||||||
# Add nginx config
|
# Add nginx config
|
||||||
ADD docker/nginx.conf /etc/nginx/nginx.conf
|
ADD docker/nginx.conf /etc/nginx/nginx.conf
|
||||||
|
|
||||||
|
# Add required environment variables to php-fpm
|
||||||
|
RUN echo "env[ENV_DIR]=%%%ENV_DIR%%%" >> /etc/php7/php-fpm.d/www.conf
|
||||||
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
|
||||||
# add overlay
|
# add overlay
|
||||||
ADD docker/s6 /etc/s6/
|
ADD docker/s6 /etc/s6/
|
||||||
|
|
||||||
# expose start
|
# expose start
|
||||||
CMD exec s6-svscan /etc/s6/
|
CMD /usr/bin/php /configure.php && exec s6-svscan /etc/s6/
|
||||||
|
|
343
README.md
Executable file → Normal file
|
@ -1,222 +1,164 @@
|
||||||
# README
|
# README
|
||||||
|
|
||||||
|
[![Build Status](https://drone.myservermanager.com/api/badges/varakh/ts3web/status.svg)](https://drone.myservermanager.com/varakh/ts3web)
|
||||||
|
|
||||||
ts3web is a free and open-source web interface for TeamSpeak 3 instances.
|
ts3web is a free and open-source web interface for TeamSpeak 3 instances.
|
||||||
|
|
||||||
The minimalistic approach of this application is intentional.
|
The minimalistic approach of this application is intentional.
|
||||||
|
|
||||||
* Docker images available on [https://hub.docker.com/r/varakh/ts3web](https://hub.docker.com/r/varakh/ts3web)
|
* Docker images available on [https://hub.docker.com/r/varakh/ts3web](https://hub.docker.com/r/varakh/ts3web)
|
||||||
* Sources are hosted on [https://github.com/v4rakh/ts3web](https://github.com/v4rakh/ts3web)
|
* Sources are hosted on [https://git.myservermanager.com/varakh/ts3web](https://git.myservermanager.com/varakh/ts3web)
|
||||||
|
|
||||||
There are many TeamSpeak 3 web interfaces out. Why should I pick ts3web?
|
There are many TeamSpeak 3 web interfaces out. Why should I pick ts3web? Free, simple, stateless, easy to extend,
|
||||||
Free, simple, stateless, easy to extend, standard bootstrap theme.
|
standard bootstrap theme.
|
||||||
|
|
||||||
## F.A.Q
|
The main git repository is hosted at
|
||||||
|
_[https://git.myservermanager.com/varakh/ts3web](https://git.myservermanager.com/varakh/ts3web)_.
|
||||||
|
Other repositories are mirrors and pull requests, issues, and planning are managed there.
|
||||||
|
|
||||||
Questions? Here you'll hopefully get the answer. Feel free to read before starting.
|
Contributions are very welcome!
|
||||||
|
|
||||||
<a name="flood"></a>
|
## Limitations
|
||||||
###### I always get `flood client` message when clicking anywhere in the web interface.
|
|
||||||
ts3web makes heavy use of query commands. When your instance is up and running, you should be able to change
|
|
||||||
`serverinstance_serverquery_flood_commands` to a high value, e.g. `100` and `serverinstance_serverquery_flood_time` to
|
|
||||||
`1` which is enough.
|
|
||||||
|
|
||||||
<a name="whitelist"></a>
|
TeamSpeak has a detailed interface for permissions and uploading files, therefore the following features are not
|
||||||
###### I always get `TSException: Error: host isn't a ts3 instance!` when selecting a server.
|
supported:
|
||||||
You probably got query banned from your server. You need to properly define your [`whitelist.txt` file](#whitelisttxtexample)
|
|
||||||
and include it in your TeamSpeak application.
|
|
||||||
|
|
||||||
<a name="dockerperms"></a>
|
* uploading files (only viewing and deleting, use the official client for uploading)
|
||||||
###### I always get `no write permissions` or something similar when trying to save snapshots or when a log entry is created.
|
* editing permissions (only viewing, use the client for editing)
|
||||||
This probably happens when you're in the docker setup. Ensure that host binds have permissions set up properly.
|
|
||||||
The user which is used in the docker container is `nobody` with id `65534`. If, e.g. logs are host bound, then execute
|
|
||||||
`chown -R 65534:65534 host/path/to/log`. The same holds true for snapshots.
|
|
||||||
|
|
||||||
## Configuration
|
## READ BEFORE USING
|
||||||
|
|
||||||
The main configuration file for the *web interface* is the `env` file located in `config/`. There's an example file
|
This web interface makes **heavy use of TeamSpeak 3 server query commands**. Please ensure that you _increase query
|
||||||
called `env.example` which you **need** to copy to `config/env`. Defaults will assume you're running your TeamSpeak
|
limits_ and whitelist the requesting IP address to a `whitelist.txt` when in a docker environment (see below).
|
||||||
server on `localhost` with default port. Docker deployments can and *should* host bind this file into the container
|
|
||||||
directly and just maintain the `env` file.
|
|
||||||
|
|
||||||
## Deployment
|
Please read the next sections carefully.
|
||||||
The application can be deployed two different ways. See below for more information. For each deployment type a running
|
|
||||||
TeamSpeak 3 instance is a prerequisite.
|
|
||||||
|
|
||||||
In the `docker-compose.yml` [example](#dockercompose), a setup together with a teamspeak server instance is shown.
|
## Setup
|
||||||
|
|
||||||
### Docker
|
_ts3web_ can be deployed natively or via docker. It's recommended to use docker with docker-compose. Those steps are
|
||||||
|
outlined below.
|
||||||
|
|
||||||
#### Important. Read before setup!
|
### docker-compose
|
||||||
|
|
||||||
1. [Setup write permissions if you're using host binds](#dockerperms)
|
General remarks:
|
||||||
2. [Ensure that you set `flood commands` to a higher value in your TeamSpeak](#flood).
|
|
||||||
3. [Use a `whitelist.txt` to ensure the web interface will not be query banned](#whitelist)
|
|
||||||
4. Be aware that the web interface will not be able to use `localhost` as TeamSpeak 3 server address because it's not
|
|
||||||
available in a docker container. The public address also has to match the environment variable
|
|
||||||
`teamspeak_host=your-public-address` within the `env` file.
|
|
||||||
|
|
||||||
<a name="dockerrun"></a>
|
* By default, `/var/www/html/application/config/env` is used for bootstrapping necessary configuration, can be set to another parent directory with `ENV_DIR` in docker environment variable, e.g., `ENV_DIR=/data`
|
||||||
#### docker run
|
* By default, `/var/www/html/application/data/snapshots` is used for storing snapshots, path can be changed in the `env` file with `snapshot_dir`
|
||||||
The following section outlines a manual setup. Feel free to use the provided `docker-compose.yml` as quick setup.
|
* By default, `/var/www/html/application/log` is used for storing and reading logs, path can be changed in the `env` file with `log_dir`
|
||||||
|
* Other `env` configuration values are outlined in the [env.example](./config/env.example) file which is also present in the default docker image.
|
||||||
|
|
||||||
1. Create docker volumes for `snapshots`, `log` and `env`. Alternative is to host bind them into your containers.
|
It's recommended to use the `network=HOST` option for the docker setup, and it will be the only example in this `README` file.
|
||||||
2. Create a docker network with a fixed IP range or later use host network.
|
|
||||||
3. Depending on your setup, you need to change `teamspeak_host` of your `env` file to point either to `your IP` or to a
|
|
||||||
`fixed docker IP` which your teamspeak uses. `localhost` is not valid if you're using it in docker. If you're unsure,
|
|
||||||
please take a look at the example `docker-compose.yml` files.
|
|
||||||
4. Start a container using the docker image `varakh/ts3web` and provide the following bindings for volumes:
|
|
||||||
* `{env_file_volume|host_file}:/var/www/html/applicationconfig/env`
|
|
||||||
* `{snapshot_volume|host_folder}:/var/www/html/application/data/snapshots`
|
|
||||||
* `{log_volume|host_folder}:/var/www/html/application/log`
|
|
||||||
5. [Ensure that you're whitelisting the IP from which the webinterface will issue commands.](#whitelist)
|
|
||||||
6. Run the `docker run` command including your settings, volumes and networks (if any): `docker run --name teamspeak_web -v ./env:/var/www/html/application/config/env -p 8181:80 varakh/ts3web:latest`.
|
|
||||||
|
|
||||||
<a name="dockercompose"></a>
|
Let's create the docker volumes first. You could also use automatically generated ones by the `docker-compose` file, you
|
||||||
#### docker-compose
|
would need to remove the `external: true` in the `volumes` section of the `docker-compose.yml` then.
|
||||||
In order for TeamSpeak to show correct IP and country flags, the `network_mode = "host"` is advised. It's also
|
|
||||||
possible to set everything up [without using the host network mode and use fixed IPs](#withouthostmode).
|
|
||||||
|
|
||||||
The examples will use host binds for volumes. Feel free to adapt the `docker-compose.yml` template and use docker volumes
|
Create the external volumes:
|
||||||
instead if you like.
|
|
||||||
|
|
||||||
Ensure to [apply permissions](#dockerperms) for volumes though.
|
|
||||||
|
|
||||||
<a name="withhostmode"></a>
|
|
||||||
#### With 'host' mode
|
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker volume create ts3-vol
|
||||||
|
docker volume create ts3web-vol
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Paste the example `docker-compose.yml` into a file on your machine:
|
||||||
|
|
||||||
|
```yaml
|
||||||
version: '2.1'
|
version: '2.1'
|
||||||
networks:
|
networks:
|
||||||
teamspeak:
|
teamspeak:
|
||||||
external: false
|
external: false
|
||||||
|
|
||||||
services:
|
services:
|
||||||
app:
|
app:
|
||||||
container_name: teamspeak_app
|
container_name: teamspeak_app
|
||||||
image: teamspeak:latest
|
image: teamspeak:latest
|
||||||
volumes:
|
volumes:
|
||||||
- ./ts3server:/var/ts3server
|
- ts3-vol:/var/ts3server
|
||||||
- ./whitelist.txt:/whitelist.txt
|
# ports are all public here in the HOST mode example
|
||||||
ports:
|
|
||||||
- 10011:10011
|
|
||||||
- 30033:30033
|
|
||||||
- 9987:9987/udp
|
|
||||||
environment:
|
environment:
|
||||||
- TS3SERVER_LICENSE=accept
|
- TS3SERVER_LICENSE=accept
|
||||||
- TS3SERVER_IP_WHITELIST=/whitelist.txt
|
- TS3SERVER_IP_WHITELIST=/var/ts3server/whitelist.txt
|
||||||
restart: always
|
restart: unless-stopped
|
||||||
network_mode: "host"
|
network_mode: "host"
|
||||||
|
|
||||||
web:
|
web:
|
||||||
container_name: teamspeak_web
|
container_name: teamspeak_web
|
||||||
image: varakh/ts3web:latest
|
image: varakh/ts3web:latest
|
||||||
volumes:
|
volumes:
|
||||||
- ./env:/var/www/html/application/config/env
|
- ts3web-vol:/data
|
||||||
- ./snapshots:/var/www/html/application/data/snapshots
|
environment:
|
||||||
- ./log:/var/www/html/application/log
|
# volume needs to contain the env file!
|
||||||
|
- ENV_DIR=/data
|
||||||
ports:
|
ports:
|
||||||
- 127.0.0.1:8181:80
|
- 127.0.0.1:8181:80
|
||||||
depends_on:
|
depends_on:
|
||||||
- app
|
- app
|
||||||
restart: always
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
- teamspeak
|
- teamspeak
|
||||||
```
|
|
||||||
|
|
||||||
<a name="withouthostmode"></a>
|
|
||||||
#### Without 'host' mode
|
|
||||||
|
|
||||||
```
|
|
||||||
version: '2.1'
|
|
||||||
networks:
|
|
||||||
teamspeak:
|
|
||||||
driver: bridge
|
|
||||||
ipam:
|
|
||||||
config:
|
|
||||||
- subnet: 10.5.0.0/16
|
|
||||||
gateway: 10.5.0.1
|
|
||||||
|
|
||||||
services:
|
|
||||||
app:
|
|
||||||
container_name: teamspeak_app
|
|
||||||
image: teamspeak:latest
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./ts3server:/var/ts3server
|
ts3-vol:
|
||||||
- ./whitelist.txt:/whitelist.txt
|
ts3web-vol:
|
||||||
environment:
|
|
||||||
- TS3SERVER_LICENSE=accept
|
|
||||||
- TS3SERVER_IP_WHITELIST=/whitelist.txt
|
|
||||||
restart: always
|
|
||||||
ports:
|
|
||||||
- 10011:10011
|
|
||||||
- 30033:30033
|
|
||||||
- 9987:9987/udp
|
|
||||||
networks:
|
|
||||||
teamspeak:
|
|
||||||
ipv4_address: 10.5.0.5
|
|
||||||
web:
|
|
||||||
container_name: teamspeak_web
|
|
||||||
image: varakh/ts3web:latest
|
|
||||||
volumes:
|
|
||||||
- ./env:/var/www/html/application/config/env
|
|
||||||
- ./snapshots:/var/www/html/application/data/snapshots
|
|
||||||
- ./log:/var/www/html/application/log
|
|
||||||
ports:
|
|
||||||
- 127.0.0.1:8181:80
|
|
||||||
depends_on:
|
|
||||||
- app
|
|
||||||
restart: always
|
|
||||||
networks:
|
|
||||||
teamspeak:
|
|
||||||
ipv4_address: 10.5.0.6
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Let's populate our docker volumes **before** we start!
|
||||||
|
|
||||||
<a name="whitelisttxtexample"></a>
|
```shell
|
||||||
#### whitelist.txt
|
docker run -d --rm --name ts3web_creator -v ts3web-vol:/mnt alpine tail -f /dev/null
|
||||||
|
docker exec -it ts3web_creator sh
|
||||||
|
|
||||||
The following illustrates a valid `whitelist.txt` file which can be used for the above `docker-compose` setups. You
|
# inside the container, edit the env by copying the example to the docker volume mount path at /data/env
|
||||||
need to replace `your-public-ip` with the TeamSpeak's public IP address if required or remove the fixed internal
|
cp /var/www/html/application/config/env /data/env
|
||||||
docker IP if you're on 'host' mode.
|
|
||||||
|
|
||||||
```
|
# edit the env file to your liking
|
||||||
127.0.0.1
|
#
|
||||||
::1
|
# the teamspeak_host should point to your public ip address and must be whitelisted inside the teamspeak server itself
|
||||||
10.5.0.5
|
vi env
|
||||||
your-public-ip
|
|
||||||
|
# create necessary directories and set permissions
|
||||||
|
mkdir -p /data/log
|
||||||
|
touch /data/log/application.log
|
||||||
|
mkdir -p /data/snapshots
|
||||||
|
chown -R 65534:65534 /data
|
||||||
|
|
||||||
|
# exit the container
|
||||||
|
exit
|
||||||
|
|
||||||
|
# on the host system, stop the creator container
|
||||||
|
docker stop ts3web_creator
|
||||||
```
|
```
|
||||||
|
|
||||||
Now execute `docker-compose up -d` to start those containers. If you like to update, do `docker-compose down`,
|
Let's populate the teamspeak container with a proper `whitelist.txt` file. See [ensure that you're whitelisting the IP from which the webinterface will issue commands](#whitelisttextfile).
|
||||||
`docker-compose pull` and then `docker-compose up -d` again.
|
|
||||||
|
|
||||||
Your TeamSpeak 3 Server will be available under `public-server-ip:9987`. The web interface will be available on
|
```shell
|
||||||
`127.0.0.1:8181`. You need to add a [reverse proxy](#reverseproxy) and probably you also want SSL configured if you expose it via domain.
|
docker run -d --rm --name ts3_creator -v ts3-vol:/mnt alpine tail -f /dev/null
|
||||||
For testing purposes, change `- 127.0.0.1:8181:80` to `- 8181:80`. The web interface will then be available under
|
docker exec -it ts3_creator sh
|
||||||
`public-server-ip:8181`.
|
|
||||||
|
|
||||||
This is **not recommended**! Secure your setup properly via [reverse proxy and SSL](#reverseproxy).
|
# edit the whitelist.txt file at /var/ts3server/whitelist.txt
|
||||||
|
# it should contain the following entries
|
||||||
|
#
|
||||||
|
# 127.0.0.1
|
||||||
|
# ::1
|
||||||
|
# your-public-ip
|
||||||
|
#
|
||||||
|
vi /var/ts3server/whitelist.txt
|
||||||
|
|
||||||
### As native PHP application
|
# exit the container
|
||||||
**Prerequisite**: `php`, `composer` and probably `php-fpm` installed on the server.
|
exit
|
||||||
|
|
||||||
#### Install:
|
# on the host system, stop the creator container
|
||||||
* Clone repository
|
docker stop ts3_creator
|
||||||
* Change directory to project home
|
```
|
||||||
* Execute `composer install`
|
|
||||||
* `composer install`
|
|
||||||
* Do the configuration by coping the `env.example` file (see information above)
|
|
||||||
* Use a web server _or_ run directly via the embedded PHP server: `php -S localhost:8080 -t public public/index.php`.
|
|
||||||
* Point your browser to [localhost:8080](http://localhost:8080)
|
|
||||||
* Apply any [whitelist.txt](#whitelisttxtexample) changes if you configured `teamspeak_host` differently than `localhost`
|
|
||||||
|
|
||||||
#### Upgrade:
|
Maybe you like to copy valid license files into the `ts3-vol` docker volume before stopping.
|
||||||
* Change directory to project home
|
|
||||||
* `git pull`
|
_Finally_, start the stack with `docker-compose up -d`. Please see the **Reverse proxy** section for a nginx example.
|
||||||
* `composer update`
|
|
||||||
|
|
||||||
<a name="reverseproxy"></a>
|
|
||||||
### Reverse proxy
|
### Reverse proxy
|
||||||
|
|
||||||
Here's an example on how to configure a reverse proxy for the web interface docker container
|
Here's an example on how to configure a reverse proxy for the web interface docker container
|
||||||
|
|
||||||
```
|
```shell
|
||||||
root .../public;
|
root .../public;
|
||||||
index index.php;
|
index index.php;
|
||||||
|
|
||||||
|
@ -243,19 +185,87 @@ Here's an example on how to configure a reverse proxy for the web interface dock
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Limitations
|
## Native application
|
||||||
|
|
||||||
TeamSpeak has a detailed interface for permissions and uploading files, therefore the following features are not
|
**Prerequisite**: `php`, `composer` and probably `php-fpm` installed on the server.
|
||||||
supported:
|
|
||||||
|
|
||||||
* uploading files (only viewing and deleting, use the official client for uploading)
|
### Install
|
||||||
* editing permissions (only viewing, use the client for editing)
|
|
||||||
|
* Clone repository
|
||||||
|
* Change directory to project home
|
||||||
|
* Execute `composer install`
|
||||||
|
* `composer install`
|
||||||
|
* Do the configuration by coping the `env.example` file (see information above)
|
||||||
|
* Use a web server _or_ run directly via the embedded PHP server: `php -S localhost:8080 -t public public/index.php`.
|
||||||
|
* Point your browser to [localhost:8080](http://localhost:8080)
|
||||||
|
* Apply any [whitelist.txt](#whitelist-text-file) changes if you configured `teamspeak_host` differently
|
||||||
|
than `localhost`
|
||||||
|
|
||||||
|
### Upgrade
|
||||||
|
|
||||||
|
* Change directory to project home
|
||||||
|
* `git pull`
|
||||||
|
* `composer update`
|
||||||
|
|
||||||
|
## Troubleshooting / F.A.Q
|
||||||
|
|
||||||
|
<a name="flood"></a>
|
||||||
|
### How to overcome server query limit?
|
||||||
|
|
||||||
|
You might get one of these messages:
|
||||||
|
|
||||||
|
> I always get `flood client` message when clicking anywhere in the web interface.
|
||||||
|
|
||||||
|
The web UI uses query commands _a lot_! When your instance is up and running, you should be able to change the following
|
||||||
|
setting, e.g. directly in your database (MySQL or sqlite).
|
||||||
|
|
||||||
|
```ini
|
||||||
|
serverinstance_serverquery_flood_commands = 9999
|
||||||
|
serverinstance_serverquery_max_connections_per_ip = 999
|
||||||
|
serverinstance_serverquery_flood_time = 1
|
||||||
|
```
|
||||||
|
|
||||||
|
<a name="whitelist"></a>
|
||||||
|
> I always get `TSException: Error: host isn't a ts3 instance!` when selecting a server.
|
||||||
|
|
||||||
|
You're probably on a docker environment and the TeamSpeak server is queried through the web UI which
|
||||||
|
resides behind a web server, so the TeamSpeak server thinks that the _remote web server IP address_ invokes the query
|
||||||
|
commands and thus blacklists it.
|
||||||
|
|
||||||
|
You need define an exception for you server's IP in a [`whitelist.txt`](#whitelisttextfile) file and include it in
|
||||||
|
your TeamSpeak application.
|
||||||
|
|
||||||
|
You can also add the desired IP to `query_ip_allowlist.txt` and `query_ip_whitelist.txt` within the TeamSpeak 3 Server
|
||||||
|
data directory.
|
||||||
|
|
||||||
|
<a name="dockerperms"></a>
|
||||||
|
### I always get `no write permissions` or something similar when trying to save snapshots or when a log entry is created.
|
||||||
|
|
||||||
|
This probably happens when you're in the docker setup. Ensure that host binds have permissions set up properly and also files inside any
|
||||||
|
docker volume has the correct permissions. The user which is used in the docker container is `nobody` with id `65534`.
|
||||||
|
|
||||||
|
Change owner permissions recursively with `chown -R 65534:65534 /path/to/dir`.
|
||||||
|
|
||||||
|
<a name="whitelisttextfile"></a>
|
||||||
|
### What's a whitelist.txt and why do I need it?
|
||||||
|
|
||||||
|
The following illustrates a valid `whitelist.txt` file which can be used for the above `docker-compose` setups. You need
|
||||||
|
to replace `your-public-ip` with the TeamSpeak's public IP address if required or remove the fixed internal docker IP if
|
||||||
|
you're on 'host' mode.
|
||||||
|
|
||||||
|
```
|
||||||
|
127.0.0.1
|
||||||
|
::1
|
||||||
|
10.5.0.5
|
||||||
|
your-public-ip
|
||||||
|
```
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
If you're willing to contribute, here's some information.
|
Contributions are welcome!
|
||||||
|
|
||||||
### Release
|
### Release
|
||||||
|
|
||||||
* Set a date in the `CHANGELOG.md` file
|
* Set a date in the `CHANGELOG.md` file
|
||||||
* Remove `SNAPSHOT` from the version in `Constants.php`
|
* Remove `SNAPSHOT` from the version in `Constants.php`
|
||||||
* Build the docker image from the project
|
* Build the docker image from the project
|
||||||
|
@ -274,7 +284,9 @@ If you're willing to contribute, here's some information.
|
||||||
4. Don't forget to clean up all created branches
|
4. Don't forget to clean up all created branches
|
||||||
|
|
||||||
### Helpers
|
### Helpers
|
||||||
Attributes can be defined when including `table`, `keyvalues` and `form` templates of twig. This helps to generate tables and forms without the need to specify all attributes.
|
|
||||||
|
Attributes can be defined when including `table`, `keyvalues` and `form` templates of twig. This helps to generate
|
||||||
|
tables and forms without the need to specify all attributes.
|
||||||
|
|
||||||
```
|
```
|
||||||
hiddenDependingOnAttribute // hides a row depending on a value in a table
|
hiddenDependingOnAttribute // hides a row depending on a value in a table
|
||||||
|
@ -289,10 +301,15 @@ fields // define fields for a form
|
||||||
See example usage in the folder `View/bootstrap4`.
|
See example usage in the folder `View/bootstrap4`.
|
||||||
|
|
||||||
### Translations
|
### Translations
|
||||||
- This app uses Symfony Translator. It's bootstrapped in `Util\BootstrapHelper` and locales are placed under `data/locale/` and the data table `.json` file, e.g. `en_dataTable.json`. Adjust to your needs or help translating.
|
|
||||||
- Form fields (name/id should be the same) are also translated. For a field named `content` or `ConT enT` translate `form_field_content`.
|
- This app uses Symfony Translator. It's bootstrapped in `Util\BootstrapHelper` and locales are placed
|
||||||
|
under `data/locale/` and the data table `.json` file, e.g. `en_dataTable.json`. Adjust to your needs or help
|
||||||
|
translating.
|
||||||
|
- Form fields (name/id should be the same) are also translated. For a field named `content` or `ConT enT`
|
||||||
|
translate `form_field_content`.
|
||||||
|
|
||||||
### Theme
|
### Theme
|
||||||
|
|
||||||
Themes can be chosen in the `env` file by editing the `theme` variable. Templates are mapped to the corresponding view
|
Themes can be chosen in the `env` file by editing the `theme` variable. Templates are mapped to the corresponding view
|
||||||
folder in `src/View/<themeName>`. `.css`, `.js` and other style files like `.ttf` or `.woff2` for fonts should be placed
|
folder in `src/View/<themeName>`. `.css`, `.js` and other style files like `.ttf` or `.woff2` for fonts should be placed
|
||||||
in `public/theme/<themeName>` and accessed accordingly. See an example in `src/View/boostrap4/layout.twig`.
|
in `public/theme/<themeName>` and accessed accordingly. See an example in `src/View/boostrap4/layout.twig`.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">= 7.3",
|
"php": "^7.4",
|
||||||
"slim/slim": "3.12.2",
|
"slim/slim": "3.12.2",
|
||||||
"monolog/monolog": "1.25.1",
|
"monolog/monolog": "1.25.1",
|
||||||
"slim/twig-view": "2.5.0",
|
"slim/twig-view": "2.5.0",
|
||||||
|
|
220
composer.lock
generated
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "662470d2d1305384e645adeadeb12ad6",
|
"content-hash": "491104dafb77058da786d29651c6d9c3",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "bryanjhv/slim-session",
|
"name": "bryanjhv/slim-session",
|
||||||
|
@ -439,12 +439,12 @@
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
|
||||||
"FastRoute\\": "src/"
|
|
||||||
},
|
|
||||||
"files": [
|
"files": [
|
||||||
"src/functions.php"
|
"src/functions.php"
|
||||||
]
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"FastRoute\\": "src/"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
"license": [
|
"license": [
|
||||||
|
@ -524,29 +524,29 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "pimple/pimple",
|
"name": "pimple/pimple",
|
||||||
"version": "v3.3.1",
|
"version": "v3.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/silexphp/Pimple.git",
|
"url": "https://github.com/silexphp/Pimple.git",
|
||||||
"reference": "21e45061c3429b1e06233475cc0e1f6fc774d5b0"
|
"reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/silexphp/Pimple/zipball/21e45061c3429b1e06233475cc0e1f6fc774d5b0",
|
"url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
|
||||||
"reference": "21e45061c3429b1e06233475cc0e1f6fc774d5b0",
|
"reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.2.5",
|
"php": ">=7.2.5",
|
||||||
"psr/container": "^1.0"
|
"psr/container": "^1.1 || ^2.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/phpunit-bridge": "^5.0"
|
"symfony/phpunit-bridge": "^5.4@dev"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "3.3.x-dev"
|
"dev-master": "3.4.x-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
@ -571,9 +571,9 @@
|
||||||
"dependency injection"
|
"dependency injection"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/silexphp/Pimple/tree/v3.3.1"
|
"source": "https://github.com/silexphp/Pimple/tree/v3.5.0"
|
||||||
},
|
},
|
||||||
"time": "2020-11-24T20:35:42+00:00"
|
"time": "2021-10-28T11:13:42+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "planetteamspeak/ts3-php-framework",
|
"name": "planetteamspeak/ts3-php-framework",
|
||||||
|
@ -637,27 +637,22 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/container",
|
"name": "psr/container",
|
||||||
"version": "1.0.0",
|
"version": "1.1.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/php-fig/container.git",
|
"url": "https://github.com/php-fig/container.git",
|
||||||
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
|
"reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
"url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
|
||||||
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
"reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.3.0"
|
"php": ">=7.4.0"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "1.0.x-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"Psr\\Container\\": "src/"
|
"Psr\\Container\\": "src/"
|
||||||
|
@ -670,7 +665,7 @@
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "PHP-FIG",
|
"name": "PHP-FIG",
|
||||||
"homepage": "http://www.php-fig.org/"
|
"homepage": "https://www.php-fig.org/"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "Common Container Interface (PHP FIG PSR-11)",
|
"description": "Common Container Interface (PHP FIG PSR-11)",
|
||||||
|
@ -684,9 +679,9 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/php-fig/container/issues",
|
"issues": "https://github.com/php-fig/container/issues",
|
||||||
"source": "https://github.com/php-fig/container/tree/master"
|
"source": "https://github.com/php-fig/container/tree/1.1.2"
|
||||||
},
|
},
|
||||||
"time": "2017-02-14T16:28:37+00:00"
|
"time": "2021-11-05T16:50:12+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/http-message",
|
"name": "psr/http-message",
|
||||||
|
@ -743,16 +738,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/log",
|
"name": "psr/log",
|
||||||
"version": "1.1.3",
|
"version": "1.1.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/php-fig/log.git",
|
"url": "https://github.com/php-fig/log.git",
|
||||||
"reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
|
"reference": "d49695b909c3b7628b6289db5479a1c204601f11"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
|
"url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
|
||||||
"reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
|
"reference": "d49695b909c3b7628b6289db5479a1c204601f11",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -776,7 +771,7 @@
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "PHP-FIG",
|
"name": "PHP-FIG",
|
||||||
"homepage": "http://www.php-fig.org/"
|
"homepage": "https://www.php-fig.org/"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "Common interface for logging libraries",
|
"description": "Common interface for logging libraries",
|
||||||
|
@ -787,9 +782,9 @@
|
||||||
"psr-3"
|
"psr-3"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/php-fig/log/tree/1.1.3"
|
"source": "https://github.com/php-fig/log/tree/1.1.4"
|
||||||
},
|
},
|
||||||
"time": "2020-03-23T09:12:05+00:00"
|
"time": "2021-05-03T11:20:27+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "slim/flash",
|
"name": "slim/flash",
|
||||||
|
@ -1080,28 +1075,31 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-ctype",
|
"name": "symfony/polyfill-ctype",
|
||||||
"version": "v1.22.0",
|
"version": "v1.27.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
"url": "https://github.com/symfony/polyfill-ctype.git",
|
||||||
"reference": "c6c942b1ac76c82448322025e084cadc56048b4e"
|
"reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e",
|
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
|
||||||
"reference": "c6c942b1ac76c82448322025e084cadc56048b4e",
|
"reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1"
|
"php": ">=7.1"
|
||||||
},
|
},
|
||||||
|
"provide": {
|
||||||
|
"ext-ctype": "*"
|
||||||
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-ctype": "For best performance"
|
"ext-ctype": "For best performance"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-main": "1.22-dev"
|
"dev-main": "1.27-dev"
|
||||||
},
|
},
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
|
@ -1109,12 +1107,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
|
||||||
"Symfony\\Polyfill\\Ctype\\": ""
|
|
||||||
},
|
|
||||||
"files": [
|
"files": [
|
||||||
"bootstrap.php"
|
"bootstrap.php"
|
||||||
]
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Polyfill\\Ctype\\": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
"license": [
|
"license": [
|
||||||
|
@ -1139,7 +1137,7 @@
|
||||||
"portable"
|
"portable"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.0"
|
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
@ -1155,32 +1153,35 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2021-01-07T16:49:33+00:00"
|
"time": "2022-11-03T14:55:06+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-mbstring",
|
"name": "symfony/polyfill-mbstring",
|
||||||
"version": "v1.22.0",
|
"version": "v1.27.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||||
"reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13"
|
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f377a3dd1fde44d37b9831d68dc8dea3ffd28e13",
|
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
|
||||||
"reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13",
|
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1"
|
"php": ">=7.1"
|
||||||
},
|
},
|
||||||
|
"provide": {
|
||||||
|
"ext-mbstring": "*"
|
||||||
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-mbstring": "For best performance"
|
"ext-mbstring": "For best performance"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-main": "1.22-dev"
|
"dev-main": "1.27-dev"
|
||||||
},
|
},
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
|
@ -1188,12 +1189,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
|
||||||
"Symfony\\Polyfill\\Mbstring\\": ""
|
|
||||||
},
|
|
||||||
"files": [
|
"files": [
|
||||||
"bootstrap.php"
|
"bootstrap.php"
|
||||||
]
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Polyfill\\Mbstring\\": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
"license": [
|
"license": [
|
||||||
|
@ -1219,7 +1220,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.0"
|
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
@ -1235,7 +1236,83 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2021-01-07T16:49:33+00:00"
|
"time": "2022-11-03T14:55:06+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/polyfill-php72",
|
||||||
|
"version": "v1.27.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/polyfill-php72.git",
|
||||||
|
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
|
||||||
|
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.1"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-main": "1.27-dev"
|
||||||
|
},
|
||||||
|
"thanks": {
|
||||||
|
"name": "symfony/polyfill",
|
||||||
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"bootstrap.php"
|
||||||
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Polyfill\\Php72\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Nicolas Grekas",
|
||||||
|
"email": "p@tchwork.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"keywords": [
|
||||||
|
"compatibility",
|
||||||
|
"polyfill",
|
||||||
|
"portable",
|
||||||
|
"shim"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://symfony.com/sponsor",
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/fabpot",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2022-11-03T14:55:06+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/translation",
|
"name": "symfony/translation",
|
||||||
|
@ -1468,31 +1545,32 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "twig/twig",
|
"name": "twig/twig",
|
||||||
"version": "v2.14.3",
|
"version": "v2.15.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/twigphp/Twig.git",
|
"url": "https://github.com/twigphp/Twig.git",
|
||||||
"reference": "8bc568d460d88b25c00c046256ec14a787ea60d9"
|
"reference": "ab402673db8746cb3a4c46f3869d6253699f614a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/8bc568d460d88b25c00c046256ec14a787ea60d9",
|
"url": "https://api.github.com/repos/twigphp/Twig/zipball/ab402673db8746cb3a4c46f3869d6253699f614a",
|
||||||
"reference": "8bc568d460d88b25c00c046256ec14a787ea60d9",
|
"reference": "ab402673db8746cb3a4c46f3869d6253699f614a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.2.5",
|
"php": ">=7.1.3",
|
||||||
"symfony/polyfill-ctype": "^1.8",
|
"symfony/polyfill-ctype": "^1.8",
|
||||||
"symfony/polyfill-mbstring": "^1.3"
|
"symfony/polyfill-mbstring": "^1.3",
|
||||||
|
"symfony/polyfill-php72": "^1.8"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"psr/container": "^1.0",
|
"psr/container": "^1.0",
|
||||||
"symfony/phpunit-bridge": "^4.4.9|^5.0.9"
|
"symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "2.14-dev"
|
"dev-master": "2.15-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
@ -1531,7 +1609,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/twigphp/Twig/issues",
|
"issues": "https://github.com/twigphp/Twig/issues",
|
||||||
"source": "https://github.com/twigphp/Twig/tree/v2.14.3"
|
"source": "https://github.com/twigphp/Twig/tree/v2.15.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
@ -1543,7 +1621,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2021-01-05T15:34:33+00:00"
|
"time": "2022-09-28T08:40:08+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vlucas/phpdotenv",
|
"name": "vlucas/phpdotenv",
|
||||||
|
@ -1661,12 +1739,12 @@
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-0": {
|
|
||||||
"cli": "lib/"
|
|
||||||
},
|
|
||||||
"files": [
|
"files": [
|
||||||
"lib/cli/cli.php"
|
"lib/cli/cli.php"
|
||||||
]
|
],
|
||||||
|
"psr-0": {
|
||||||
|
"cli": "lib/"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
"license": [
|
"license": [
|
||||||
|
@ -2025,7 +2103,7 @@
|
||||||
"prefer-stable": false,
|
"prefer-stable": false,
|
||||||
"prefer-lowest": false,
|
"prefer-lowest": false,
|
||||||
"platform": {
|
"platform": {
|
||||||
"php": ">= 7.3"
|
"php": "^7.4"
|
||||||
},
|
},
|
||||||
"platform-dev": [],
|
"platform-dev": [],
|
||||||
"plugin-api-version": "2.0.0"
|
"plugin-api-version": "2.0.0"
|
||||||
|
|
|
@ -8,15 +8,15 @@ class Constants
|
||||||
/**
|
/**
|
||||||
* Years tag
|
* Years tag
|
||||||
*/
|
*/
|
||||||
const YEARS = '2020-2021';
|
const YEARS = '2020-2023';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Version tag
|
* Version tag
|
||||||
*/
|
*/
|
||||||
const VERSION = '2.2.3';
|
const VERSION = '2.2.6';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return constant by it's class name
|
* Return constant by its class name
|
||||||
*
|
*
|
||||||
* @param $value
|
* @param $value
|
||||||
* @return string|null
|
* @return string|null
|
||||||
|
|
|
@ -8,12 +8,27 @@ class EnvConstants
|
||||||
/**
|
/**
|
||||||
* Example env file
|
* Example env file
|
||||||
*/
|
*/
|
||||||
const ENV_FILE_EXAMPLE = "env.example";
|
const FILE_NAME_EXAMPLE_ENV = "env.example";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom env file
|
* Custom env file
|
||||||
*/
|
*/
|
||||||
const ENV_FILE = "env";
|
const FILE_NAME_ENV = "env";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The path to the env file
|
||||||
|
*/
|
||||||
|
const ENV_DIR = "ENV_DIR";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The path to the logs directory
|
||||||
|
*/
|
||||||
|
const LOG_DIR = "log_dir";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The path to the snapshots directory
|
||||||
|
*/
|
||||||
|
const SNAPSHOT_DIR = "snapshot_dir";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Site title
|
* Site title
|
||||||
|
@ -31,7 +46,7 @@ class EnvConstants
|
||||||
const SITE_DATE_FORMAT = "site_date_format";
|
const SITE_DATE_FORMAT = "site_date_format";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* THeme
|
* Theme
|
||||||
*/
|
*/
|
||||||
const THEME = "theme";
|
const THEME = "theme";
|
||||||
|
|
||||||
|
|
|
@ -8,12 +8,16 @@ theme="bootstrap4" # values: bootstrap4 (foldernames are used to determine theme
|
||||||
theme_cache=false # values: true|false (cache view/twig. makes it faster, disable for debug)
|
theme_cache=false # values: true|false (cache view/twig. makes it faster, disable for debug)
|
||||||
|
|
||||||
# teamspeak
|
# teamspeak
|
||||||
teamspeak_host="localhost" # 'localhost' or 'name_of_docker_container' if running locally
|
teamspeak_host="app" # 'localhost' or 'name_of_docker_container|name_of_the_docker-compose_service' if running locally
|
||||||
teamspeak_query_port=10011
|
teamspeak_query_port=10011
|
||||||
teamspeak_user="serveradmin"
|
teamspeak_user="serveradmin"
|
||||||
teamspeak_tree_view="true" # show a tree view in the details of online clients if a server has been selected
|
teamspeak_tree_view="true" # show a tree view in the details of online clients if a server has been selected
|
||||||
teamspeak_log_lines=100 # show this amount of latest log lines
|
teamspeak_log_lines=100 # show this amount of latest log lines
|
||||||
|
|
||||||
# log
|
# log
|
||||||
|
log_dir=/var/www/html/application/log
|
||||||
log_name="ts3web" # values: all strings
|
log_name="ts3web" # values: all strings
|
||||||
log_level="INFO" # values: DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY
|
log_level="INFO" # values: DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY
|
||||||
|
|
||||||
|
# snapshots
|
||||||
|
snapshot_dir=/var/www/html/application/data/snapshots
|
||||||
|
|
22
docker/configure.php
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
echo "Adapting ENV_DIR..." . PHP_EOL;
|
||||||
|
|
||||||
|
$path = '/etc/php7/php-fpm.d/www.conf';
|
||||||
|
$env = "ENV_DIR";
|
||||||
|
|
||||||
|
$fileContent = file_get_contents($path);
|
||||||
|
$fileContent = preg_replace("/%%%" . strtoupper($env) . "%%%/", env($env, "/var/www/html/application/config"), $fileContent);
|
||||||
|
file_put_contents($path, $fileContent);
|
||||||
|
|
||||||
|
function env($name, $default = null)
|
||||||
|
{
|
||||||
|
$v = getenv($name) ?: $default;
|
||||||
|
|
||||||
|
if ($v === null) {
|
||||||
|
return "''";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "'" . $v . "'";
|
||||||
|
}
|
0
public/images/flags/ad.png
Executable file → Normal file
Before Width: | Height: | Size: 643 B After Width: | Height: | Size: 643 B |
0
public/images/flags/ae.png
Executable file → Normal file
Before Width: | Height: | Size: 408 B After Width: | Height: | Size: 408 B |
0
public/images/flags/af.png
Executable file → Normal file
Before Width: | Height: | Size: 604 B After Width: | Height: | Size: 604 B |
0
public/images/flags/ag.png
Executable file → Normal file
Before Width: | Height: | Size: 591 B After Width: | Height: | Size: 591 B |
0
public/images/flags/ai.png
Executable file → Normal file
Before Width: | Height: | Size: 643 B After Width: | Height: | Size: 643 B |
0
public/images/flags/al.png
Executable file → Normal file
Before Width: | Height: | Size: 600 B After Width: | Height: | Size: 600 B |
0
public/images/flags/am.png
Executable file → Normal file
Before Width: | Height: | Size: 497 B After Width: | Height: | Size: 497 B |
0
public/images/flags/an.png
Executable file → Normal file
Before Width: | Height: | Size: 488 B After Width: | Height: | Size: 488 B |
0
public/images/flags/ao.png
Executable file → Normal file
Before Width: | Height: | Size: 428 B After Width: | Height: | Size: 428 B |
0
public/images/flags/ar.png
Executable file → Normal file
Before Width: | Height: | Size: 506 B After Width: | Height: | Size: 506 B |
0
public/images/flags/as.png
Executable file → Normal file
Before Width: | Height: | Size: 647 B After Width: | Height: | Size: 647 B |
0
public/images/flags/at.png
Executable file → Normal file
Before Width: | Height: | Size: 403 B After Width: | Height: | Size: 403 B |
0
public/images/flags/au.png
Executable file → Normal file
Before Width: | Height: | Size: 673 B After Width: | Height: | Size: 673 B |
0
public/images/flags/aw.png
Executable file → Normal file
Before Width: | Height: | Size: 524 B After Width: | Height: | Size: 524 B |
0
public/images/flags/ax.png
Executable file → Normal file
Before Width: | Height: | Size: 663 B After Width: | Height: | Size: 663 B |
0
public/images/flags/az.png
Executable file → Normal file
Before Width: | Height: | Size: 589 B After Width: | Height: | Size: 589 B |
0
public/images/flags/ba.png
Executable file → Normal file
Before Width: | Height: | Size: 593 B After Width: | Height: | Size: 593 B |
0
public/images/flags/bb.png
Executable file → Normal file
Before Width: | Height: | Size: 585 B After Width: | Height: | Size: 585 B |
0
public/images/flags/bd.png
Executable file → Normal file
Before Width: | Height: | Size: 504 B After Width: | Height: | Size: 504 B |
0
public/images/flags/be.png
Executable file → Normal file
Before Width: | Height: | Size: 449 B After Width: | Height: | Size: 449 B |
0
public/images/flags/bf.png
Executable file → Normal file
Before Width: | Height: | Size: 497 B After Width: | Height: | Size: 497 B |
0
public/images/flags/bg.png
Executable file → Normal file
Before Width: | Height: | Size: 462 B After Width: | Height: | Size: 462 B |
0
public/images/flags/bh.png
Executable file → Normal file
Before Width: | Height: | Size: 457 B After Width: | Height: | Size: 457 B |
0
public/images/flags/bi.png
Executable file → Normal file
Before Width: | Height: | Size: 675 B After Width: | Height: | Size: 675 B |
0
public/images/flags/bj.png
Executable file → Normal file
Before Width: | Height: | Size: 486 B After Width: | Height: | Size: 486 B |
0
public/images/flags/bl.png
Executable file → Normal file
Before Width: | Height: | Size: 545 B After Width: | Height: | Size: 545 B |
0
public/images/flags/bm.png
Executable file → Normal file
Before Width: | Height: | Size: 611 B After Width: | Height: | Size: 611 B |
0
public/images/flags/bn.png
Executable file → Normal file
Before Width: | Height: | Size: 639 B After Width: | Height: | Size: 639 B |
0
public/images/flags/bo.png
Executable file → Normal file
Before Width: | Height: | Size: 500 B After Width: | Height: | Size: 500 B |
0
public/images/flags/br.png
Executable file → Normal file
Before Width: | Height: | Size: 593 B After Width: | Height: | Size: 593 B |
0
public/images/flags/bs.png
Executable file → Normal file
Before Width: | Height: | Size: 526 B After Width: | Height: | Size: 526 B |
0
public/images/flags/bt.png
Executable file → Normal file
Before Width: | Height: | Size: 631 B After Width: | Height: | Size: 631 B |
0
public/images/flags/bv.png
Executable file → Normal file
Before Width: | Height: | Size: 512 B After Width: | Height: | Size: 512 B |
0
public/images/flags/bw.png
Executable file → Normal file
Before Width: | Height: | Size: 443 B After Width: | Height: | Size: 443 B |
0
public/images/flags/by.png
Executable file → Normal file
Before Width: | Height: | Size: 514 B After Width: | Height: | Size: 514 B |
0
public/images/flags/bz.png
Executable file → Normal file
Before Width: | Height: | Size: 600 B After Width: | Height: | Size: 600 B |
0
public/images/flags/ca.png
Executable file → Normal file
Before Width: | Height: | Size: 628 B After Width: | Height: | Size: 628 B |
0
public/images/flags/cc.png
Executable file → Normal file
Before Width: | Height: | Size: 625 B After Width: | Height: | Size: 625 B |
0
public/images/flags/cd.png
Executable file → Normal file
Before Width: | Height: | Size: 528 B After Width: | Height: | Size: 528 B |
0
public/images/flags/cf.png
Executable file → Normal file
Before Width: | Height: | Size: 614 B After Width: | Height: | Size: 614 B |
0
public/images/flags/cg.png
Executable file → Normal file
Before Width: | Height: | Size: 521 B After Width: | Height: | Size: 521 B |
0
public/images/flags/ch.png
Executable file → Normal file
Before Width: | Height: | Size: 367 B After Width: | Height: | Size: 367 B |
0
public/images/flags/ci.png
Executable file → Normal file
Before Width: | Height: | Size: 453 B After Width: | Height: | Size: 453 B |
0
public/images/flags/ck.png
Executable file → Normal file
Before Width: | Height: | Size: 586 B After Width: | Height: | Size: 586 B |
0
public/images/flags/cl.png
Executable file → Normal file
Before Width: | Height: | Size: 450 B After Width: | Height: | Size: 450 B |
0
public/images/flags/cm.png
Executable file → Normal file
Before Width: | Height: | Size: 525 B After Width: | Height: | Size: 525 B |
0
public/images/flags/cn.png
Executable file → Normal file
Before Width: | Height: | Size: 472 B After Width: | Height: | Size: 472 B |
0
public/images/flags/co.png
Executable file → Normal file
Before Width: | Height: | Size: 483 B After Width: | Height: | Size: 483 B |
0
public/images/flags/cr.png
Executable file → Normal file
Before Width: | Height: | Size: 477 B After Width: | Height: | Size: 477 B |
0
public/images/flags/cs.png
Executable file → Normal file
Before Width: | Height: | Size: 439 B After Width: | Height: | Size: 439 B |
0
public/images/flags/cu.png
Executable file → Normal file
Before Width: | Height: | Size: 563 B After Width: | Height: | Size: 563 B |
0
public/images/flags/cv.png
Executable file → Normal file
Before Width: | Height: | Size: 529 B After Width: | Height: | Size: 529 B |
0
public/images/flags/cx.png
Executable file → Normal file
Before Width: | Height: | Size: 608 B After Width: | Height: | Size: 608 B |
0
public/images/flags/cy.png
Executable file → Normal file
Before Width: | Height: | Size: 428 B After Width: | Height: | Size: 428 B |
0
public/images/flags/cz.png
Executable file → Normal file
Before Width: | Height: | Size: 476 B After Width: | Height: | Size: 476 B |
0
public/images/flags/de.png
Executable file → Normal file
Before Width: | Height: | Size: 545 B After Width: | Height: | Size: 545 B |
0
public/images/flags/dj.png
Executable file → Normal file
Before Width: | Height: | Size: 572 B After Width: | Height: | Size: 572 B |
0
public/images/flags/dk.png
Executable file → Normal file
Before Width: | Height: | Size: 495 B After Width: | Height: | Size: 495 B |
0
public/images/flags/dm.png
Executable file → Normal file
Before Width: | Height: | Size: 620 B After Width: | Height: | Size: 620 B |
0
public/images/flags/do.png
Executable file → Normal file
Before Width: | Height: | Size: 508 B After Width: | Height: | Size: 508 B |
0
public/images/flags/dz.png
Executable file → Normal file
Before Width: | Height: | Size: 582 B After Width: | Height: | Size: 582 B |
0
public/images/flags/ec.png
Executable file → Normal file
Before Width: | Height: | Size: 500 B After Width: | Height: | Size: 500 B |
0
public/images/flags/ee.png
Executable file → Normal file
Before Width: | Height: | Size: 429 B After Width: | Height: | Size: 429 B |
0
public/images/flags/eg.png
Executable file → Normal file
Before Width: | Height: | Size: 465 B After Width: | Height: | Size: 465 B |
0
public/images/flags/eh.png
Executable file → Normal file
Before Width: | Height: | Size: 508 B After Width: | Height: | Size: 508 B |
0
public/images/flags/er.png
Executable file → Normal file
Before Width: | Height: | Size: 653 B After Width: | Height: | Size: 653 B |
0
public/images/flags/es.png
Executable file → Normal file
Before Width: | Height: | Size: 469 B After Width: | Height: | Size: 469 B |
0
public/images/flags/et.png
Executable file → Normal file
Before Width: | Height: | Size: 592 B After Width: | Height: | Size: 592 B |
0
public/images/flags/fi.png
Executable file → Normal file
Before Width: | Height: | Size: 489 B After Width: | Height: | Size: 489 B |
0
public/images/flags/fj.png
Executable file → Normal file
Before Width: | Height: | Size: 610 B After Width: | Height: | Size: 610 B |
0
public/images/flags/fk.png
Executable file → Normal file
Before Width: | Height: | Size: 648 B After Width: | Height: | Size: 648 B |
0
public/images/flags/fm.png
Executable file → Normal file
Before Width: | Height: | Size: 552 B After Width: | Height: | Size: 552 B |
0
public/images/flags/fo.png
Executable file → Normal file
Before Width: | Height: | Size: 474 B After Width: | Height: | Size: 474 B |
0
public/images/flags/fr.png
Executable file → Normal file
Before Width: | Height: | Size: 545 B After Width: | Height: | Size: 545 B |
0
public/images/flags/ga.png
Executable file → Normal file
Before Width: | Height: | Size: 489 B After Width: | Height: | Size: 489 B |
0
public/images/flags/gb.png
Executable file → Normal file
Before Width: | Height: | Size: 599 B After Width: | Height: | Size: 599 B |
0
public/images/flags/gd.png
Executable file → Normal file
Before Width: | Height: | Size: 637 B After Width: | Height: | Size: 637 B |
0
public/images/flags/ge.png
Executable file → Normal file
Before Width: | Height: | Size: 594 B After Width: | Height: | Size: 594 B |
0
public/images/flags/gf.png
Executable file → Normal file
Before Width: | Height: | Size: 545 B After Width: | Height: | Size: 545 B |
0
public/images/flags/gg.png
Executable file → Normal file
Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 362 B |
0
public/images/flags/gh.png
Executable file → Normal file
Before Width: | Height: | Size: 490 B After Width: | Height: | Size: 490 B |
0
public/images/flags/gi.png
Executable file → Normal file
Before Width: | Height: | Size: 463 B After Width: | Height: | Size: 463 B |
0
public/images/flags/gl.png
Executable file → Normal file
Before Width: | Height: | Size: 470 B After Width: | Height: | Size: 470 B |
0
public/images/flags/gm.png
Executable file → Normal file
Before Width: | Height: | Size: 493 B After Width: | Height: | Size: 493 B |
0
public/images/flags/gn.png
Executable file → Normal file
Before Width: | Height: | Size: 480 B After Width: | Height: | Size: 480 B |
0
public/images/flags/gp.png
Executable file → Normal file
Before Width: | Height: | Size: 488 B After Width: | Height: | Size: 488 B |
0
public/images/flags/gq.png
Executable file → Normal file
Before Width: | Height: | Size: 537 B After Width: | Height: | Size: 537 B |
0
public/images/flags/gr.png
Executable file → Normal file
Before Width: | Height: | Size: 487 B After Width: | Height: | Size: 487 B |
0
public/images/flags/gs.png
Executable file → Normal file
Before Width: | Height: | Size: 630 B After Width: | Height: | Size: 630 B |