2019-01-18 16:49:49 +00:00
# README
2021-05-20 23:05:38 +00:00
2023-03-25 08:28:18 +00:00
[![Build Status ](https://drone.myservermanager.com/api/badges/varakh/ts3web/status.svg )](https://drone.myservermanager.com/varakh/ts3web)
2023-04-08 08:17:27 +00:00
_ts3web_ is a free and open-source web interface for TeamSpeak 3 instances.
2021-05-20 23:05:38 +00:00
2019-08-07 15:56:21 +00:00
The minimalistic approach of this application is intentional.
2018-04-03 11:56:20 +00:00
2019-11-08 20:39:43 +00:00
* Docker images available on [https://hub.docker.com/r/varakh/ts3web ](https://hub.docker.com/r/varakh/ts3web )
2022-07-05 15:46:47 +00:00
* Sources are hosted on [https://git.myservermanager.com/varakh/ts3web ](https://git.myservermanager.com/varakh/ts3web )
2018-04-03 11:56:20 +00:00
2023-04-08 08:17:27 +00:00
There are many TeamSpeak 3 web interfaces out. Why should I pick _ts3web_ ? Free, simple, stateless, easy to extend,
2021-05-20 23:05:38 +00:00
standard bootstrap theme.
2019-01-18 23:59:24 +00:00
2023-04-06 20:55:21 +00:00
The main git repository is hosted at
_[https://git.myservermanager.com/varakh/ts3web](https://git.myservermanager.com/varakh/ts3web)_.
2022-07-05 20:09:17 +00:00
Other repositories are mirrors and pull requests, issues, and planning are managed there.
Contributions are very welcome!
2023-04-06 20:55:21 +00:00
## Limitations
2021-05-24 13:40:31 +00:00
2023-04-06 20:55:21 +00:00
TeamSpeak has a detailed interface for permissions and uploading files, therefore the following features are not
supported:
2019-01-18 16:49:49 +00:00
2023-04-06 20:55:21 +00:00
* uploading files (only viewing and deleting, use the official client for uploading)
* editing permissions (only viewing, use the client for editing)
2021-05-24 13:40:31 +00:00
2023-04-06 20:55:21 +00:00
## READ BEFORE USING
2021-02-07 13:46:40 +00:00
2023-04-06 20:55:21 +00:00
This web interface makes **heavy use of TeamSpeak 3 server query commands** . Please ensure that you _increase query
limits_ and whitelist the requesting IP address to a `whitelist.txt` when in a docker environment (see below).
2021-05-20 23:05:38 +00:00
2023-04-06 20:55:21 +00:00
Please read the next sections carefully.
2021-05-20 23:05:38 +00:00
2023-04-06 20:55:21 +00:00
## Setup
2021-05-24 13:40:31 +00:00
2023-04-06 20:55:21 +00:00
_ts3web_ can be deployed natively or via docker. It's recommended to use docker with docker-compose. Those steps are
outlined below.
2021-05-24 13:40:31 +00:00
2023-04-06 20:55:21 +00:00
### docker-compose
2021-05-24 13:40:31 +00:00
2023-04-06 20:55:21 +00:00
General remarks:
2019-01-18 23:59:24 +00:00
2023-04-06 20:55:21 +00:00
* 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`
* By default, `/var/www/html/application/data/snapshots` is used for storing snapshots, path can be changed in the `env` file with `snapshot_dir`
* 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`
2023-04-08 08:17:27 +00:00
* Other `env` configuration values are outlined in the [env example ](./config/env.example ) file which is also present in the default docker image.
2021-05-20 23:05:38 +00:00
2023-04-08 08:17:27 +00:00
It's recommended to use the `network=HOST` option for the docker setup. You can also work with other network modes.
In that case you'll need to assign static networks though for the web interface to work.
2021-05-20 23:05:38 +00:00
2023-04-08 08:17:27 +00:00
Let's start with the `network=HOST` example. Create the docker volumes first. You could also use automatically generated
ones by the `docker-compose` file, you would need to remove the `external: true` in the `volumes` section of the
`docker-compose.yml` then.
2021-05-24 13:40:31 +00:00
2023-04-06 20:55:21 +00:00
Create the external volumes:
2021-05-24 13:40:31 +00:00
2023-04-06 20:55:21 +00:00
```shell
docker volume create ts3-vol
docker volume create ts3web-vol
```
2021-05-20 23:05:38 +00:00
2023-04-06 20:55:21 +00:00
Paste the example `docker-compose.yml` into a file on your machine:
2019-01-18 23:59:24 +00:00
2023-04-06 20:55:21 +00:00
```yaml
2019-11-08 20:39:43 +00:00
version: '2.1'
2019-08-06 18:25:50 +00:00
networks:
teamspeak:
external: false
2023-04-06 20:55:21 +00:00
2019-08-06 18:25:50 +00:00
services:
app:
container_name: teamspeak_app
image: teamspeak:latest
volumes:
2023-04-06 20:55:21 +00:00
- ts3-vol:/var/ts3server
# ports are all public here in the HOST mode example
2019-08-06 18:25:50 +00:00
environment:
- TS3SERVER_LICENSE=accept
2023-04-06 20:55:21 +00:00
- TS3SERVER_IP_WHITELIST=/var/ts3server/whitelist.txt
restart: unless-stopped
2019-08-06 18:25:50 +00:00
network_mode: "host"
2023-04-06 20:55:21 +00:00
2019-08-06 18:25:50 +00:00
web:
container_name: teamspeak_web
2021-02-08 08:55:35 +00:00
image: varakh/ts3web:latest
2019-08-06 18:25:50 +00:00
volumes:
2023-04-06 20:55:21 +00:00
- ts3web-vol:/data
environment:
# volume needs to contain the env file!
- ENV_DIR=/data
2019-08-06 18:25:50 +00:00
ports:
- 127.0.0.1:8181:80
depends_on:
- app
2023-04-06 20:55:21 +00:00
restart: unless-stopped
2019-08-06 18:25:50 +00:00
networks:
- teamspeak
2023-04-06 20:55:21 +00:00
volumes:
ts3-vol:
ts3web-vol:
2019-08-06 18:25:50 +00:00
```
2021-05-24 13:40:31 +00:00
2023-04-06 20:55:21 +00:00
Let's populate our docker volumes **before** we start!
2018-04-03 11:56:20 +00:00
2023-04-06 20:55:21 +00:00
```shell
docker run -d --rm --name ts3web_creator -v ts3web-vol:/mnt alpine tail -f /dev/null
docker exec -it ts3web_creator sh
2021-05-20 23:05:38 +00:00
2023-04-08 08:17:27 +00:00
# edit the env file to your liking, you can start by copying the env.example of this git repository
# in config/ and edit to your liking
2023-04-06 20:55:21 +00:00
#
2023-04-08 08:17:27 +00:00
# IMPORTANT: the teamspeak_host should point to your public ip address and
# it must be whitelisted inside the teamspeak server itself
2023-04-06 20:55:21 +00:00
vi env
2021-02-07 13:46:40 +00:00
2023-04-06 20:55:21 +00:00
# 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
2021-02-07 13:46:40 +00:00
2023-04-06 20:55:21 +00:00
# on the host system, stop the creator container
docker stop ts3web_creator
2021-02-07 13:46:40 +00:00
```
2023-04-08 08:17:27 +00:00
Let's populate the teamspeak container with a proper `whitelist.txt` file. **Ensure that you're
[whitelisting ](#whitelist.txt ) the IP from which the webinterface will issue commands inside the teamspeak server.
2021-02-07 13:46:40 +00:00
2023-04-06 20:55:21 +00:00
```shell
docker run -d --rm --name ts3_creator -v ts3-vol:/mnt alpine tail -f /dev/null
docker exec -it ts3_creator sh
2021-02-07 13:46:40 +00:00
2023-04-06 20:55:21 +00:00
# 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
# exit the container
exit
# on the host system, stop the creator container
docker stop ts3_creator
2021-02-07 13:46:40 +00:00
```
2023-04-06 20:55:21 +00:00
Maybe you like to copy valid license files into the `ts3-vol` docker volume before stopping.
_Finally_, start the stack with `docker-compose up -d` . Please see the **Reverse proxy** section for a nginx example.
### Reverse proxy
2023-04-08 08:17:27 +00:00
Here's an example on how to configure a reverse proxy for _ts3web_ docker container
2023-04-06 20:55:21 +00:00
```shell
root .../public;
index index.php;
# enable and setup if you have a certificate (highly recommended)
#ssl on;
#ssl_certificate fullchain.pem;
#ssl_certificate_key privkey.pem;
rewrite_log on;
2019-01-18 23:59:24 +00:00
2023-04-06 20:55:21 +00:00
location / {
try_files $uri $uri/ @ee ;
}
2019-01-18 23:59:24 +00:00
2023-04-06 20:55:21 +00:00
location @ee {
rewrite ^(.*) /index.php?$1 last;
}
2018-04-03 11:56:20 +00:00
2023-04-06 20:55:21 +00:00
# php fpm
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
include fastcgi_params;
}
```
## Native application
2021-05-20 23:05:38 +00:00
2019-08-06 18:25:50 +00:00
**Prerequisite**: `php` , `composer` and probably `php-fpm` installed on the server.
2019-01-18 16:49:49 +00:00
2023-04-06 20:55:21 +00:00
### Install
2021-05-20 23:05:38 +00:00
2019-01-18 16:49:49 +00:00
* Clone repository
* Change directory to project home
2019-01-18 23:59:24 +00:00
* Execute `composer install`
2019-01-18 16:49:49 +00:00
* `composer install`
2023-04-08 08:17:27 +00:00
* Do the configuration by coping the `env.example` file to `env` inside the `config/` directory
2021-02-07 13:46:40 +00:00
* 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 )
2023-04-08 08:17:27 +00:00
* Apply any [whitelist.txt ](#whitelist-text-file ) changes if you configured `teamspeak_host` differently than `localhost`
2019-01-18 16:49:49 +00:00
2023-04-06 20:55:21 +00:00
### Upgrade
2021-05-20 23:05:38 +00:00
2018-04-03 11:56:20 +00:00
* Change directory to project home
2023-04-08 08:17:27 +00:00
* `git pull` (be sure to be on `master` branch!)
2018-04-03 11:56:20 +00:00
* `composer update`
2023-04-06 20:55:21 +00:00
## Troubleshooting / F.A.Q
2021-05-20 23:05:38 +00:00
2023-04-06 20:55:21 +00:00
< a name = "flood" > < / a >
### How to overcome server query limit?
2021-02-07 13:46:40 +00:00
2023-04-06 20:55:21 +00:00
You might get one of these messages:
2021-02-07 13:46:40 +00:00
2023-04-06 20:55:21 +00:00
> I always get `flood client` message when clicking anywhere in the web interface.
2021-02-07 13:46:40 +00:00
2023-04-08 08:17:27 +00:00
The web UI uses query commands _a lot_ to the TeamSpeak server! 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).
2021-02-07 13:46:40 +00:00
2023-04-06 20:55:21 +00:00
```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.
2023-04-08 08:17:27 +00:00
You need define an exception for you server's IP in a [`whitelist.txt` ](#whitelist.txt ) file and include it in
2023-04-06 20:55:21 +00:00
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.
2023-04-08 08:17:27 +00:00
< a name = "whitelist.txt" > < / a >
### What do I need to type into the `whitelist.txt`?
2023-04-06 20:55:21 +00:00
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
2023-04-08 08:17:27 +00:00
you're on `network=HOST` mode.
2023-04-06 20:55:21 +00:00
```
127.0.0.1
::1
10.5.0.5
your-public-ip
```
2019-08-06 18:25:50 +00:00
2023-04-08 08:17:27 +00:00
< 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` .
2019-08-06 18:25:50 +00:00
## Development
2023-04-06 20:55:21 +00:00
Contributions are welcome!
2021-02-07 13:46:40 +00:00
2019-08-06 18:25:50 +00:00
### Release
2021-05-20 23:05:38 +00:00
2019-08-06 18:25:50 +00:00
* Set a date in the `CHANGELOG.md` file
2019-11-10 14:37:04 +00:00
* Remove `SNAPSHOT` from the version in `Constants.php`
2023-04-08 08:17:27 +00:00
* Adapt the occurrences inside the `.drone.yml` with the new version
2020-03-22 12:41:45 +00:00
* Build the docker image from the project
2021-05-20 23:05:38 +00:00
* if necessary, add GitHub access token to let composer pull dependencies within the image correctly:
add `&& composer config --global --auth github-oauth.github.com <token> \` before the `composer install` command,
where `<token>` can be retrieved from [GitHub settings ](https://github.com/settings/tokens )
2021-02-08 08:55:35 +00:00
* execute `sudo docker build --no-cache -t varakh/ts3web:latest .` to build
2020-03-22 12:41:45 +00:00
* publish it
2019-11-10 14:34:32 +00:00
* Tag the release git commit and create a new release in the VCS web interface
### Prepare next development cycle
1. Branch from `master` to `release/prepare-newVersionNumber`
2019-11-10 14:37:04 +00:00
2. Add `-SNAPSHOT` to the version in `Constants.php` and increase it
2023-04-08 08:17:27 +00:00
3. Adapt the occurrences inside the `.drone.yml` with the new version
4. Merge this branch to `patch` or/and `dev` respectively
5. Don't forget to clean up all created branches
2018-04-03 11:56:20 +00:00
2019-08-06 18:25:50 +00:00
### Helpers
2021-05-20 23:05:38 +00:00
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.
2018-04-05 19:20:29 +00:00
```
hiddenDependingOnAttribute // hides a row depending on a value in a table
hiddenColumns // hides an entire column depending on a key in a table
links // generates a link for a specific cell in a table or keyvalue
additional_links // generates extra columns in a table
filters // applies filters depending on a key in a table or key value view
attributesEditable // define editable attributes in the key value view
fields // define fields for a form
```
2019-08-06 18:25:50 +00:00
See example usage in the folder `View/bootstrap4` .
2018-04-05 19:20:29 +00:00
2019-08-06 18:25:50 +00:00
### Translations
2021-05-20 23:05:38 +00:00
- 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` .
2018-04-03 11:56:20 +00:00
2019-08-06 18:25:50 +00:00
### Theme
2021-05-20 23:05:38 +00:00
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
2019-11-16 11:21:43 +00:00
in `public/theme/<themeName>` and accessed accordingly. See an example in `src/View/boostrap4/layout.twig` .