Update Docker container mappings to map most items to dirs under a common `/var/azuracast/storage`.

This commit is contained in:
Buster Neece 2023-11-02 03:09:27 -05:00
parent 3cf805cf6a
commit 7d9470ba51
No known key found for this signature in database
13 changed files with 110 additions and 34 deletions

View File

@ -37,6 +37,11 @@ release channel, you can take advantage of these new features and fixes.
subdomains; this is useful for self-hosted services like MinIO or other services that rely on subdirectories instead subdomains; this is useful for self-hosted services like MinIO or other services that rely on subdirectories instead
of subdomains. of subdomains.
- We have changed the mapping for many persistent items in our Docker filesystem to map to folders
within `/var/azuracast/storage`. To preserve back-compatibility, for most users we will continue to map the individual
folders within that as separate volumes, but if you manually manage your volume mounts, you can now just mount a
volume at `/var/azuracast/storage` instead of each of the separate subfolders.
## Bug Fixes ## Bug Fixes
- For stations using the AutoDJ to broadcast, the threshold for what counts as "Station Offline" has been changed, which - For stations using the AutoDJ to broadcast, the threshold for what counts as "Station Offline" has been changed, which

View File

@ -181,15 +181,15 @@ services:
PUID: ${AZURACAST_PUID:-1000} PUID: ${AZURACAST_PUID:-1000}
PGID: ${AZURACAST_PGID:-1000} PGID: ${AZURACAST_PGID:-1000}
volumes: volumes:
- www_uploads:/var/azuracast/uploads
- station_data:/var/azuracast/stations - station_data:/var/azuracast/stations
- shoutcast2_install:/var/azuracast/servers/shoutcast2
- stereo_tool_install:/var/azuracast/servers/stereo_tool
- geolite_install:/var/azuracast/geoip
- sftpgo_data:/var/azuracast/sftpgo/persist
- backups:/var/azuracast/backups - backups:/var/azuracast/backups
- acme:/var/azuracast/acme
- db_data:/var/lib/mysql - db_data:/var/lib/mysql
- www_uploads:/var/azuracast/storage/uploads
- shoutcast2_install:/var/azuracast/storage/shoutcast2
- stereo_tool_install:/var/azuracast/storage/stereo_tool
- geolite_install:/var/azuracast/storage/geoip
- sftpgo_data:/var/azuracast/storage/sftpgo
- acme:/var/azuracast/storage/acme
restart: unless-stopped restart: unless-stopped
ulimits: ulimits:
nofile: nofile:

View File

@ -8,6 +8,7 @@ use App\Console\Application;
use App\Enums\SupportedLocales; use App\Enums\SupportedLocales;
use App\Http\Factory\ResponseFactory; use App\Http\Factory\ResponseFactory;
use App\Http\Factory\ServerRequestFactory; use App\Http\Factory\ServerRequestFactory;
use App\Utilities\File;
use App\Utilities\Logger as AppLogger; use App\Utilities\Logger as AppLogger;
use DI; use DI;
use Monolog\ErrorHandler; use Monolog\ErrorHandler;
@ -129,7 +130,10 @@ final class AppFactory
$environment[Environment::TEMP_DIR] ??= $parentBaseDir . '/www_tmp'; $environment[Environment::TEMP_DIR] ??= $parentBaseDir . '/www_tmp';
$environment[Environment::CONFIG_DIR] ??= $baseDir . '/config'; $environment[Environment::CONFIG_DIR] ??= $baseDir . '/config';
$environment[Environment::VIEWS_DIR] ??= $baseDir . '/templates'; $environment[Environment::VIEWS_DIR] ??= $baseDir . '/templates';
$environment[Environment::UPLOADS_DIR] ??= $parentBaseDir . '/uploads'; $environment[Environment::UPLOADS_DIR] ??= File::getFirstExistingDirectory([
$parentBaseDir . '/storage/uploads',
$parentBaseDir . '/uploads',
]);
$_ENV = getenv(); $_ENV = getenv();

View File

@ -4,11 +4,11 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Shoutcast; namespace App\Controller\Api\Admin\Shoutcast;
use App\Container\EnvironmentAwareTrait;
use App\Controller\SingleActionInterface; use App\Controller\SingleActionInterface;
use App\Entity\Api\Status; use App\Entity\Api\Status;
use App\Http\Response; use App\Http\Response;
use App\Http\ServerRequest; use App\Http\ServerRequest;
use App\Radio\Frontend\Shoutcast;
use App\Service\Flow; use App\Service\Flow;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use RuntimeException; use RuntimeException;
@ -16,8 +16,6 @@ use Symfony\Component\Process\Process;
final class PostAction implements SingleActionInterface final class PostAction implements SingleActionInterface
{ {
use EnvironmentAwareTrait;
public function __invoke( public function __invoke(
ServerRequest $request, ServerRequest $request,
Response $response, Response $response,
@ -32,8 +30,7 @@ final class PostAction implements SingleActionInterface
return $flowResponse; return $flowResponse;
} }
$scBaseDir = $this->environment->getParentDirectory() . '/servers/shoutcast2'; $scBaseDir = Shoutcast::getDirectory();
$scTgzPath = $scBaseDir . '/sc_serv.tar.gz'; $scTgzPath = $scBaseDir . '/sc_serv.tar.gz';
if (is_file($scTgzPath)) { if (is_file($scTgzPath)) {
unlink($scTgzPath); unlink($scTgzPath);

View File

@ -6,8 +6,11 @@ namespace App\Radio\Frontend;
use App\Entity\Station; use App\Entity\Station;
use App\Entity\StationMount; use App\Entity\StationMount;
use App\Environment;
use App\Service\Acme; use App\Service\Acme;
use App\Utilities\File;
use GuzzleHttp\Promise\Utils; use GuzzleHttp\Promise\Utils;
use InvalidArgumentException;
use NowPlaying\Result\Result; use NowPlaying\Result\Result;
use Psr\Http\Message\UriInterface; use Psr\Http\Message\UriInterface;
use Symfony\Component\Process\Process; use Symfony\Component\Process\Process;
@ -19,10 +22,23 @@ final class Shoutcast extends AbstractFrontend
*/ */
public function getBinary(): ?string public function getBinary(): ?string
{ {
$newPath = '/var/azuracast/servers/shoutcast2/sc_serv'; try {
return file_exists($newPath) $binaryPath = self::getDirectory() . '/sc_serv';
? $newPath return file_exists($binaryPath)
: null; ? $binaryPath
: null;
} catch (InvalidArgumentException) {
return null;
}
}
public static function getDirectory(): string
{
$parentDir = Environment::getInstance()->getParentDirectory();
return File::getFirstExistingDirectory([
$parentDir . '/servers/shoutcast2',
$parentDir . '/storage/shoutcast2',
]);
} }
public function getVersion(): ?string public function getVersion(): ?string

View File

@ -6,6 +6,7 @@ namespace App\Radio;
use App\Entity\Station; use App\Entity\Station;
use App\Environment; use App\Environment;
use App\Utilities\File;
final class StereoTool final class StereoTool
{ {
@ -21,7 +22,11 @@ final class StereoTool
public static function getLibraryPath(): string public static function getLibraryPath(): string
{ {
return Environment::getInstance()->getParentDirectory() . '/servers/stereo_tool'; $parentDir = Environment::getInstance()->getParentDirectory();
return File::getFirstExistingDirectory([
$parentDir . '/storage/stereo_tool',
$parentDir . '/servers/stereo_tool',
]);
} }
public static function isReady(Station $station): bool public static function isReady(Station $station): bool

View File

@ -13,6 +13,7 @@ use App\Message\AbstractMessage;
use App\Message\GenerateAcmeCertificate; use App\Message\GenerateAcmeCertificate;
use App\Nginx\Nginx; use App\Nginx\Nginx;
use App\Radio\Adapters; use App\Radio\Adapters;
use App\Utilities\File;
use Exception; use Exception;
use Monolog\Handler\StreamHandler; use Monolog\Handler\StreamHandler;
use Psr\Log\LogLevel; use Psr\Log\LogLevel;
@ -205,7 +206,12 @@ final class Acme
public static function getAcmeDirectory(): string public static function getAcmeDirectory(): string
{ {
return Environment::getInstance()->getParentDirectory() . '/acme'; $parentDir = Environment::getInstance()->getParentDirectory();
return File::getFirstExistingDirectory([
$parentDir . '/acme',
$parentDir . '/storage/acme',
]);
} }
public static function getCertificatePaths(): array public static function getCertificatePaths(): array

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Service\IpGeolocator; namespace App\Service\IpGeolocator;
use App\Environment; use App\Environment;
use App\Utilities\File;
final class GeoLite extends AbstractIpGeolocator final class GeoLite extends AbstractIpGeolocator
{ {
@ -15,8 +16,12 @@ final class GeoLite extends AbstractIpGeolocator
public static function getBaseDirectory(): string public static function getBaseDirectory(): string
{ {
$environment = Environment::getInstance(); $parentDir = Environment::getInstance()->getParentDirectory();
return dirname($environment->getBaseDirectory()) . '/geoip';
return File::getFirstExistingDirectory([
$parentDir . '/geoip',
$parentDir . '/storage/geoip',
]);
} }
public static function getDatabasePath(): string public static function getDatabasePath(): string

View File

@ -153,4 +153,26 @@ final class File
} }
} }
} }
public static function getFirstExistingFile(array $files): string
{
foreach ($files as $file) {
if (file_exists($file)) {
return $file;
}
}
throw new InvalidArgumentException('No existing files found.');
}
public static function getFirstExistingDirectory(array $dirs): string
{
foreach ($dirs as $dir) {
if (is_dir($dir)) {
return $dir;
}
}
throw new InvalidArgumentException('No existing directories found.');
}
} }

View File

@ -11,10 +11,14 @@ adduser --home /var/azuracast --disabled-password --gecos "" azuracast
usermod -aG www-data azuracast usermod -aG www-data azuracast
mkdir -p /var/azuracast/www /var/azuracast/stations /var/azuracast/servers/shoutcast2 \ mkdir -p /var/azuracast/www /var/azuracast/stations /var/azuracast/www_tmp \
/var/azuracast/servers/stereo_tool /var/azuracast/backups /var/azuracast/www_tmp \ /var/azuracast/dbip \
/var/azuracast/uploads /var/azuracast/geoip /var/azuracast/dbip \ /var/azuracast/storage/uploads \
/var/azuracast/acme /var/azuracast/storage/shoutcast2 \
/var/azuracast/storage/stereo_tool \
/var/azuracast/storage/geoip \
/var/azuracast/storage/sftpgo \
/var/azuracast/storage/acme
chown -R azuracast:azuracast /var/azuracast chown -R azuracast:azuracast /var/azuracast
chmod -R 777 /var/azuracast/www_tmp chmod -R 777 /var/azuracast/www_tmp

View File

@ -43,9 +43,9 @@
} }
], ],
"host_keys": [ "host_keys": [
"persist/id_rsa", "../storage/sftpgo/id_rsa",
"persist/id_ecdsa", "../storage/sftpgo/id_ecdsa",
"persist/id_ed25519" "../storage/sftpgo/id_ed25519"
], ],
"enable_scp": true "enable_scp": true
}, },

View File

@ -0,0 +1,12 @@
#!/bin/bash
export DEBIAN_FRONTEND=noninteractive
echo "Creating persist directories..."
mkdir -p /var/azuracast/storage/uploads \
/var/azuracast/storage/shoutcast2 \
/var/azuracast/storage/stereo_tool \
/var/azuracast/storage/geoip \
/var/azuracast/storage/sftpgo \
/var/azuracast/storage/acme

View File

@ -1,15 +1,15 @@
#!/bin/bash #!/bin/bash
if [[ ! -f /var/azuracast/sftpgo/persist/id_rsa ]]; then if [[ ! -f /var/azuracast/storage/sftpgo/id_rsa ]]; then
ssh-keygen -t rsa -b 4096 -f /var/azuracast/sftpgo/persist/id_rsa -q -N "" ssh-keygen -t rsa -b 4096 -f /var/azuracast/storage/sftpgo/id_rsa -q -N ""
fi fi
if [[ ! -f /var/azuracast/sftpgo/persist/id_ecdsa ]]; then if [[ ! -f /var/azuracast/storage/sftpgo/id_ecdsa ]]; then
ssh-keygen -t ecdsa -b 521 -f /var/azuracast/sftpgo/persist/id_ecdsa -q -N "" ssh-keygen -t ecdsa -b 521 -f /var/azuracast/storage/sftpgo/id_ecdsa -q -N ""
fi fi
if [[ ! -f /var/azuracast/sftpgo/persist/id_ed25519 ]]; then if [[ ! -f /var/azuracast/storage/sftpgo/id_ed25519 ]]; then
ssh-keygen -t ed25519 -f /var/azuracast/sftpgo/persist/id_ed25519 -q -N "" ssh-keygen -t ed25519 -f /var/azuracast/storage/sftpgo/id_ed25519 -q -N ""
fi fi
chown -R azuracast:azuracast /var/azuracast/sftpgo/persist chown -R azuracast:azuracast /var/azuracast/storage/sftpgo