Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8193ec801a | |||
| 78709ad392 | |||
| 8c991a4926 | |||
| f13c393406 | |||
| e32c5ec76f | |||
| 241bd493f3 | |||
| 967c9cd62b | |||
| 6dddda44f6 | |||
| f6d2efb6d8 | |||
| ce2ba6da6c | |||
| 9772d15baa | |||
| 32302fae5e | |||
| f58c878045 | |||
| dad6a6901f | |||
| 3deff372b7 | |||
| d9def86b06 | |||
| 565630cfe4 | |||
| eda66b7e69 | |||
| 0fecb99e8e | |||
| b89bfa5315 | |||
| 85fee78990 | |||
| 3b5db89dc0 | |||
| 6364eea9c2 | |||
| 3ae70f02d6 | |||
| b7f549a067 | |||
| 759811ab68 | |||
| 0122f2955c |
@@ -2,6 +2,7 @@
|
|||||||
"recommendations": [
|
"recommendations": [
|
||||||
"paisleysoftworks.renpywarp",
|
"paisleysoftworks.renpywarp",
|
||||||
"luquedaniel.languague-renpy",
|
"luquedaniel.languague-renpy",
|
||||||
"jnoortheen.nix-ide"
|
"jnoortheen.nix-ide",
|
||||||
|
"matthewpi.caddyfile-support"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
jf.soupclown.com {
|
||||||
|
reverse_proxy qmoran-desktop-1.tailc7e587.ts.net:8096
|
||||||
|
}
|
||||||
|
|
||||||
|
nd.soupclown.com {
|
||||||
|
reverse_proxy qmoran-desktop-1.tailc7e587.ts.net:4533
|
||||||
|
}
|
||||||
|
|
||||||
|
paperless.soupclown.com {
|
||||||
|
reverse_proxy qmoran-desktop.tailc7e587.ts.net:8000
|
||||||
|
}
|
||||||
|
|
||||||
|
immich.soupclown.com {
|
||||||
|
reverse_proxy qmoran-desktop.tailc7e587.ts.net:2283
|
||||||
|
}
|
||||||
|
|
||||||
|
seerr.soupclown.com {
|
||||||
|
reverse_proxy qmoran-desktop-1.tailc7e587.ts.net:5055
|
||||||
|
}
|
||||||
|
|
||||||
|
soupclown.com {
|
||||||
|
header /.well-known/matrix/* {
|
||||||
|
Access-Control-Allow-Origin *
|
||||||
|
Content-Type application/json
|
||||||
|
Cache-Control public,max-age=806400
|
||||||
|
}
|
||||||
|
|
||||||
|
# Matrix client-server well-known
|
||||||
|
handle /.well-known/matrix/client {
|
||||||
|
respond `{
|
||||||
|
"m.homeserver": {
|
||||||
|
"base_url": "https://matrix.soupclown.com"
|
||||||
|
},
|
||||||
|
"org.matrix.msc3575.proxy": {
|
||||||
|
"url": "https://matrix.soupclown.com"
|
||||||
|
}
|
||||||
|
}` 200
|
||||||
|
}
|
||||||
|
|
||||||
|
# Matrix server-server well-known
|
||||||
|
handle /.well-known/matrix/server {
|
||||||
|
respond `{
|
||||||
|
"m.server": "matrix.soupclown.com:443"
|
||||||
|
}` 200
|
||||||
|
}
|
||||||
|
|
||||||
|
# Matrix Support contact information (MSC1929)
|
||||||
|
handle /.well-known/matrix/support {
|
||||||
|
respond `{
|
||||||
|
"contacts": [
|
||||||
|
{
|
||||||
|
"matrix_id": "@qmoran:soupclown.com",
|
||||||
|
"email_address": "",
|
||||||
|
"role": "m.role.admin"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}` 200
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
matrix.soupclown.com, soupclown.com:8448 {
|
||||||
|
reverse_proxy qmoran-desktop.tailc7e587.ts.net:6167
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# dependencies (bun install)
|
||||||
|
node_modules
|
||||||
|
|
||||||
|
# output
|
||||||
|
out
|
||||||
|
dist
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# code coverage
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# logs
|
||||||
|
logs
|
||||||
|
_.log
|
||||||
|
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
|
||||||
|
|
||||||
|
# dotenv environment variable files
|
||||||
|
.env
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
.env.local
|
||||||
|
|
||||||
|
# caches
|
||||||
|
.eslintcache
|
||||||
|
.cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# IntelliJ based IDEs
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# Finder (MacOS) folder config
|
||||||
|
.DS_Store
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"configVersion": 1,
|
||||||
|
"workspaces": {
|
||||||
|
"": {
|
||||||
|
"name": "soupclown",
|
||||||
|
"dependencies": {
|
||||||
|
"commander": "^14.0.3",
|
||||||
|
"zod": "^4.3.6",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/bun": "latest",
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"typescript": "^5",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"packages": {
|
||||||
|
"@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="],
|
||||||
|
|
||||||
|
"@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="],
|
||||||
|
|
||||||
|
"bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="],
|
||||||
|
|
||||||
|
"commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
|
||||||
|
|
||||||
|
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
||||||
|
|
||||||
|
"undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="],
|
||||||
|
|
||||||
|
"zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
import { RUN_CLI } from "./src/interface/cli";
|
||||||
|
|
||||||
|
RUN_CLI()
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "soupclown",
|
||||||
|
"module": "index.ts",
|
||||||
|
"type": "module",
|
||||||
|
"private": true,
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/bun": "latest"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"typescript": "^5"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"commander": "^14.0.3",
|
||||||
|
"zod": "^4.3.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
import { Command } from "commander";
|
||||||
|
import { HOST } from "./host";
|
||||||
|
|
||||||
|
export function RUN_CLI(){
|
||||||
|
const c = new Command();
|
||||||
|
|
||||||
|
c
|
||||||
|
.name('soupclown')
|
||||||
|
.description('Soupclown system')
|
||||||
|
|
||||||
|
c
|
||||||
|
.command('host <action>')
|
||||||
|
.action(async (action, opts) => {
|
||||||
|
console.log(opts)
|
||||||
|
switch(action){
|
||||||
|
|
||||||
|
case 'init':
|
||||||
|
console.log('init action!')
|
||||||
|
console.log(`HOSTNAME: ${await HOST.getHostname()}`)
|
||||||
|
await HOST.initSystem()
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
console.log('fool!')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
c.parse();
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
import z from "zod";
|
||||||
|
import { HOST } from "./host";
|
||||||
|
|
||||||
|
const DEFAULT_CONFIG_PATH = "../../state.soupclown.json";
|
||||||
|
|
||||||
|
const hostConfigSchema = z.object({
|
||||||
|
configurationPath: z.string(),
|
||||||
|
services: z.array(z.object({
|
||||||
|
name: z.string(),
|
||||||
|
desiredState: z.enum(['up', 'down']),
|
||||||
|
})),
|
||||||
|
})
|
||||||
|
export type HOST_CONFIG_SCHEMA_T = z.infer<typeof hostConfigSchema>;
|
||||||
|
|
||||||
|
const CONFIG_SCHEMA = z.object({
|
||||||
|
v: z.literal('v1'),
|
||||||
|
data: z.map(z.string(), hostConfigSchema)
|
||||||
|
});
|
||||||
|
export type CONFIG_SCHEMA_T = z.infer<typeof CONFIG_SCHEMA>
|
||||||
|
|
||||||
|
export class SC_CONFIG_C {
|
||||||
|
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
protected runningConfig = {
|
||||||
|
v: 'v1',
|
||||||
|
data: new Map([
|
||||||
|
]),
|
||||||
|
} as CONFIG_SCHEMA_T,
|
||||||
|
){}
|
||||||
|
|
||||||
|
public static async loadConfigFile(path = DEFAULT_CONFIG_PATH){
|
||||||
|
const configFile = Bun.file(path);
|
||||||
|
let fileJsonData: any = null;
|
||||||
|
|
||||||
|
try{
|
||||||
|
fileJsonData = await configFile.json();
|
||||||
|
}catch(e){
|
||||||
|
throw "FAILED_SCHEMA_JSON_PARSE"
|
||||||
|
}
|
||||||
|
|
||||||
|
const configParseJsonResult = CONFIG_SCHEMA.safeParse(fileJsonData);
|
||||||
|
if(!configParseJsonResult.success){
|
||||||
|
throw "FAILED_CONFIG_SCHEMA_PARSE"
|
||||||
|
}
|
||||||
|
|
||||||
|
return configParseJsonResult.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async init(path = DEFAULT_CONFIG_PATH){
|
||||||
|
const newConfig = new SC_CONFIG_C();
|
||||||
|
await newConfig._loadConfigFile(path);
|
||||||
|
await newConfig._writeConfigFile(path);
|
||||||
|
return newConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async _loadConfigFile(path = DEFAULT_CONFIG_PATH){
|
||||||
|
try{
|
||||||
|
this.runningConfig = await SC_CONFIG_C.loadConfigFile(path);
|
||||||
|
const hostconfig = this.runningConfig.data.get(await HOST.getHostname());
|
||||||
|
if(hostconfig){
|
||||||
|
this.configurationPath = hostconfig.configurationPath;
|
||||||
|
this.services = hostconfig.services;
|
||||||
|
}
|
||||||
|
}catch{
|
||||||
|
console.error('Failed to load config, assuming you know what you\'re doing');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async _writeConfigFile(path = DEFAULT_CONFIG_PATH){
|
||||||
|
await Bun.write(path, JSON.stringify(this.runningConfig, null, 2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SC_CONFIG = await SC_CONFIG_C.init();
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
import { $ } from "bun";
|
||||||
|
import z, { parse } from "zod";
|
||||||
|
|
||||||
|
const CLI_ContainerInfoSchema = z.object({
|
||||||
|
ID: z.string(),
|
||||||
|
Image: z.string(),
|
||||||
|
CreatedAt: z.string(),
|
||||||
|
State: z.string(),
|
||||||
|
Names: z.string(),
|
||||||
|
})
|
||||||
|
type CLI_ContainerInfo = z.infer<typeof CLI_ContainerInfoSchema>;
|
||||||
|
|
||||||
|
const SC_ContainerInfo = z.object({
|
||||||
|
id: z.string(),
|
||||||
|
name: z.string(),
|
||||||
|
image: z.string(),
|
||||||
|
state: z.unknown(),
|
||||||
|
created: z.date(),
|
||||||
|
})
|
||||||
|
type SC_ContainerInfoT = z.infer<typeof SC_ContainerInfo>;
|
||||||
|
|
||||||
|
async function PS (){
|
||||||
|
const result = $`docker ps -a --format json`
|
||||||
|
const containerData: CLI_ContainerInfo[] = [];
|
||||||
|
|
||||||
|
for await (let line of result.lines()){
|
||||||
|
// containerData.push(JSON.parse(line));
|
||||||
|
if(line.length < "{}".length){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const parsedData = CLI_ContainerInfoSchema.parse(JSON.parse(line))
|
||||||
|
containerData.push(parsedData);
|
||||||
|
}
|
||||||
|
return containerData;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SC_DOCKER = {
|
||||||
|
PS,
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import { $ } from "bun";
|
||||||
|
import { SC_CONFIG } from "./config";
|
||||||
|
|
||||||
|
async function getHostname(){
|
||||||
|
const result = await $`hostname`.quiet().text();
|
||||||
|
return result.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function initSystem(){
|
||||||
|
// await $`mkdir -p ${SC_CONFIG.configurationPath}`
|
||||||
|
}
|
||||||
|
|
||||||
|
export const HOST = {
|
||||||
|
getHostname,
|
||||||
|
initSystem,
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
// Environment setup & latest features
|
||||||
|
"lib": ["ESNext"],
|
||||||
|
"target": "ESNext",
|
||||||
|
"module": "Preserve",
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
"allowJs": true,
|
||||||
|
|
||||||
|
// Bundler mode
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"verbatimModuleSyntax": true,
|
||||||
|
"noEmit": true,
|
||||||
|
|
||||||
|
// Best practices
|
||||||
|
"strict": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedIndexedAccess": true,
|
||||||
|
"noImplicitOverride": true,
|
||||||
|
|
||||||
|
// Some stricter flags (disabled by default)
|
||||||
|
"noUnusedLocals": false,
|
||||||
|
"noUnusedParameters": false,
|
||||||
|
"noPropertyAccessFromIndexSignature": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
# compiled output
|
|
||||||
/dist
|
|
||||||
/node_modules
|
|
||||||
/build
|
|
||||||
|
|
||||||
# Logs
|
|
||||||
logs
|
|
||||||
*.log
|
|
||||||
npm-debug.log*
|
|
||||||
pnpm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
lerna-debug.log*
|
|
||||||
|
|
||||||
# OS
|
|
||||||
.DS_Store
|
|
||||||
|
|
||||||
# Tests
|
|
||||||
/coverage
|
|
||||||
/.nyc_output
|
|
||||||
|
|
||||||
# IDEs and editors
|
|
||||||
/.idea
|
|
||||||
.project
|
|
||||||
.classpath
|
|
||||||
.c9/
|
|
||||||
*.launch
|
|
||||||
.settings/
|
|
||||||
*.sublime-workspace
|
|
||||||
|
|
||||||
# IDE - VSCode
|
|
||||||
.vscode/*
|
|
||||||
!.vscode/settings.json
|
|
||||||
!.vscode/tasks.json
|
|
||||||
!.vscode/launch.json
|
|
||||||
!.vscode/extensions.json
|
|
||||||
|
|
||||||
# dotenv environment variable files
|
|
||||||
.env
|
|
||||||
.env.development.local
|
|
||||||
.env.test.local
|
|
||||||
.env.production.local
|
|
||||||
.env.local
|
|
||||||
|
|
||||||
# temp directory
|
|
||||||
.temp
|
|
||||||
.tmp
|
|
||||||
|
|
||||||
# Runtime data
|
|
||||||
pids
|
|
||||||
*.pid
|
|
||||||
*.seed
|
|
||||||
*.pid.lock
|
|
||||||
|
|
||||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
|
||||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"singleQuote": true,
|
|
||||||
"trailingComma": "all"
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
// @ts-check
|
|
||||||
import eslint from '@eslint/js';
|
|
||||||
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
|
|
||||||
import globals from 'globals';
|
|
||||||
import tseslint from 'typescript-eslint';
|
|
||||||
|
|
||||||
export default tseslint.config(
|
|
||||||
{
|
|
||||||
ignores: ['eslint.config.mjs'],
|
|
||||||
},
|
|
||||||
eslint.configs.recommended,
|
|
||||||
...tseslint.configs.recommendedTypeChecked,
|
|
||||||
eslintPluginPrettierRecommended,
|
|
||||||
{
|
|
||||||
languageOptions: {
|
|
||||||
globals: {
|
|
||||||
...globals.node,
|
|
||||||
...globals.jest,
|
|
||||||
},
|
|
||||||
sourceType: 'commonjs',
|
|
||||||
parserOptions: {
|
|
||||||
projectService: true,
|
|
||||||
tsconfigRootDir: import.meta.dirname,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
rules: {
|
|
||||||
'@typescript-eslint/no-explicit-any': 'off',
|
|
||||||
'@typescript-eslint/no-floating-promises': 'warn',
|
|
||||||
'@typescript-eslint/no-unsafe-argument': 'warn',
|
|
||||||
"prettier/prettier": ["error", { endOfLine: "auto" }],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
);
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://json.schemastore.org/nest-cli",
|
|
||||||
"collection": "@nestjs/schematics",
|
|
||||||
"sourceRoot": "src",
|
|
||||||
"compilerOptions": {
|
|
||||||
"deleteOutDir": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "core",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"description": "",
|
|
||||||
"author": "",
|
|
||||||
"private": true,
|
|
||||||
"license": "UNLICENSED",
|
|
||||||
"scripts": {
|
|
||||||
"build": "nest build",
|
|
||||||
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
||||||
"start": "nest start",
|
|
||||||
"start:dev": "nest start --watch",
|
|
||||||
"start:debug": "nest start --debug --watch",
|
|
||||||
"start:prod": "node dist/main",
|
|
||||||
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
|
||||||
"test": "jest",
|
|
||||||
"test:watch": "jest --watch",
|
|
||||||
"test:cov": "jest --coverage",
|
|
||||||
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
|
||||||
"test:e2e": "jest --config ./test/jest-e2e.json"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@nestjs/common": "^11.0.1",
|
|
||||||
"@nestjs/core": "^11.0.1",
|
|
||||||
"@nestjs/platform-express": "^11.0.1",
|
|
||||||
"@nestjs/platform-socket.io": "^11.1.19",
|
|
||||||
"@nestjs/websockets": "^11.1.19",
|
|
||||||
"reflect-metadata": "^0.2.2",
|
|
||||||
"rxjs": "^7.8.1"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@eslint/eslintrc": "^3.2.0",
|
|
||||||
"@eslint/js": "^9.18.0",
|
|
||||||
"@nestjs/cli": "^11.0.0",
|
|
||||||
"@nestjs/schematics": "^11.0.0",
|
|
||||||
"@nestjs/testing": "^11.0.1",
|
|
||||||
"@types/express": "^5.0.0",
|
|
||||||
"@types/jest": "^30.0.0",
|
|
||||||
"@types/node": "^24.0.0",
|
|
||||||
"@types/supertest": "^7.0.0",
|
|
||||||
"eslint": "^9.18.0",
|
|
||||||
"eslint-config-prettier": "^10.0.1",
|
|
||||||
"eslint-plugin-prettier": "^5.2.2",
|
|
||||||
"globals": "^17.0.0",
|
|
||||||
"jest": "^30.0.0",
|
|
||||||
"prettier": "^3.4.2",
|
|
||||||
"source-map-support": "^0.5.21",
|
|
||||||
"supertest": "^7.0.0",
|
|
||||||
"ts-jest": "^29.2.5",
|
|
||||||
"ts-loader": "^9.5.2",
|
|
||||||
"ts-node": "^10.9.2",
|
|
||||||
"tsconfig-paths": "^4.2.0",
|
|
||||||
"typescript": "^5.7.3",
|
|
||||||
"typescript-eslint": "^8.20.0"
|
|
||||||
},
|
|
||||||
"jest": {
|
|
||||||
"moduleFileExtensions": [
|
|
||||||
"js",
|
|
||||||
"json",
|
|
||||||
"ts"
|
|
||||||
],
|
|
||||||
"rootDir": "src",
|
|
||||||
"testRegex": ".*\\.spec\\.ts$",
|
|
||||||
"transform": {
|
|
||||||
"^.+\\.(t|j)s$": "ts-jest"
|
|
||||||
},
|
|
||||||
"collectCoverageFrom": [
|
|
||||||
"**/*.(t|j)s"
|
|
||||||
],
|
|
||||||
"coverageDirectory": "../coverage",
|
|
||||||
"testEnvironment": "node"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
import { Module } from '@nestjs/common';
|
|
||||||
import { AppService } from './app.service';
|
|
||||||
import { BackupModule } from './backup/backup.module';
|
|
||||||
|
|
||||||
@Module({
|
|
||||||
imports: [BackupModule],
|
|
||||||
controllers: [],
|
|
||||||
providers: [AppService],
|
|
||||||
})
|
|
||||||
export class AppModule {}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
import { Injectable } from '@nestjs/common';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class AppService {
|
|
||||||
getHello(): string {
|
|
||||||
return 'Hello World!';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import {
|
|
||||||
MessageBody,
|
|
||||||
SubscribeMessage,
|
|
||||||
WebSocketGateway,
|
|
||||||
WebSocketServer,
|
|
||||||
WsResponse,
|
|
||||||
} from '@nestjs/websockets';
|
|
||||||
import { from, Observable } from 'rxjs';
|
|
||||||
import { map } from 'rxjs/operators';
|
|
||||||
import { Server } from 'socket.io';
|
|
||||||
|
|
||||||
@WebSocketGateway({
|
|
||||||
cors: {
|
|
||||||
origin: '*',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
export class BackupGateway {
|
|
||||||
@WebSocketServer()
|
|
||||||
server: Server;
|
|
||||||
|
|
||||||
@SubscribeMessage('events')
|
|
||||||
findAll(@MessageBody() data: any): Observable<WsResponse<number>> {
|
|
||||||
return from([1, 2, 3]).pipe(map(item => ({ event: 'events', data: item })));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SubscribeMessage('identity')
|
|
||||||
async identity(@MessageBody() data: number): Promise<number> {
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import { Module } from '@nestjs/common';
|
|
||||||
import { BackupGateway } from './backup.gateway';
|
|
||||||
|
|
||||||
@Module({
|
|
||||||
imports: [],
|
|
||||||
controllers: [],
|
|
||||||
providers: [BackupGateway],
|
|
||||||
})
|
|
||||||
export class BackupModule {}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
import { NestFactory } from '@nestjs/core';
|
|
||||||
import { AppModule } from './app.module';
|
|
||||||
|
|
||||||
async function bootstrap() {
|
|
||||||
const app = await NestFactory.create(AppModule);
|
|
||||||
await app.listen(process.env.PORT ?? 3000);
|
|
||||||
}
|
|
||||||
bootstrap();
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "./tsconfig.json",
|
|
||||||
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"module": "nodenext",
|
|
||||||
"moduleResolution": "nodenext",
|
|
||||||
"resolvePackageJsonExports": true,
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"isolatedModules": true,
|
|
||||||
"declaration": true,
|
|
||||||
"removeComments": true,
|
|
||||||
"emitDecoratorMetadata": true,
|
|
||||||
"experimentalDecorators": true,
|
|
||||||
"allowSyntheticDefaultImports": true,
|
|
||||||
"target": "ES2023",
|
|
||||||
"sourceMap": true,
|
|
||||||
"outDir": "./dist",
|
|
||||||
"baseUrl": "./",
|
|
||||||
"incremental": true,
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"strictNullChecks": true,
|
|
||||||
"forceConsistentCasingInFileNames": true,
|
|
||||||
"noImplicitAny": false,
|
|
||||||
"strictBindCallApply": false,
|
|
||||||
"noFallthroughCasesInSwitch": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
|
||||||
|
AUTO_SETUP_GLOBAL_PASSWORD=someGenericPassword
|
||||||
|
AUTO_SETUP_NET_HOSTNAME=pt1
|
||||||
|
AUTO_SETUP_HEADLESS=1
|
||||||
|
AUTO_SETUP_AUTOMATED=1
|
||||||
|
AUTO_SETUP_INSTALL_SOFTWARE_ID=137 152
|
||||||
|
AUTO_SETUP_SSH_PUBKEY=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAkhSg+CLjIYSZ+lTNkChYAP7uxpPrl1TvVPwCfYgSoa
|
||||||
|
AUTO_SETUP_SSH_PUBKEY=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINhzgTeNWuHeznJJlRXRysKA3msMnUvALMkADOIJyGwb
|
||||||
|
|
||||||
|
AUTO_SETUP_LOCALE=C.UTF-8
|
||||||
|
AUTO_SETUP_KEYBOARD_LAYOUT=us
|
||||||
|
AUTO_SETUP_TIMEZONE=America/New_York
|
||||||
|
AUTO_SETUP_NET_ETHERNET_ENABLED=1
|
||||||
|
AUTO_SETUP_NET_WIFI_ENABLED=1
|
||||||
|
AUTO_SETUP_NET_WIFI_COUNTRY_CODE=US
|
||||||
|
AUTO_SETUP_NET_USESTATIC=0
|
||||||
|
AUTO_SETUP_NET_STATIC_IP=192.168.0.100
|
||||||
|
AUTO_SETUP_NET_STATIC_MASK=255.255.255.0
|
||||||
|
AUTO_SETUP_NET_STATIC_GATEWAY=192.168.0.1
|
||||||
|
AUTO_SETUP_NET_STATIC_DNS=9.9.9.9 149.112.112.112
|
||||||
|
AUTO_SETUP_DHCP_TO_STATIC=0
|
||||||
|
AUTO_SETUP_NET_ETH_FORCE_SPEED=0
|
||||||
|
AUTO_SETUP_BOOT_WAIT_FOR_NETWORK=1
|
||||||
|
AUTO_SETUP_SWAPFILE_SIZE=1
|
||||||
|
AUTO_SETUP_SWAPFILE_LOCATION=/var/swap
|
||||||
|
CONFIG_SERIAL_CONSOLE_ENABLE=0
|
||||||
|
AUTO_UNMASK_LOGIND=0
|
||||||
|
AUTO_SETUP_CUSTOM_SCRIPT_EXEC=0
|
||||||
|
AUTO_SETUP_BACKUP_RESTORE=0
|
||||||
|
AUTO_SETUP_SSH_SERVER_INDEX=-2
|
||||||
|
AUTO_SETUP_DESKTOP=none
|
||||||
|
AUTO_SETUP_LOGGING_INDEX=-3
|
||||||
|
AUTO_SETUP_RAMLOG_MAXSIZE=50
|
||||||
|
AUTO_SETUP_WEB_SERVER_INDEX=0
|
||||||
|
AUTO_SETUP_BROWSER_INDEX=0
|
||||||
|
AUTO_SETUP_AUTOSTART_TARGET_INDEX=0
|
||||||
|
AUTO_SETUP_AUTOSTART_LOGIN_USER=root
|
||||||
|
SURVEY_OPTED_IN=0
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_CPU_GOVERNOR=schedutil
|
||||||
|
CONFIG_CPU_ONDEMAND_SAMPLE_RATE=25000
|
||||||
|
CONFIG_CPU_ONDEMAND_SAMPLE_DOWNFACTOR=40
|
||||||
|
CONFIG_CPU_USAGE_THROTTLE_UP=50
|
||||||
|
CONFIG_CPU_TEMP_PATH=auto
|
||||||
|
CONFIG_CPU_MAX_FREQ=Disabled
|
||||||
|
CONFIG_CPU_MIN_FREQ=Disabled
|
||||||
|
CONFIG_CPU_DISABLE_TURBO=0
|
||||||
|
CONFIG_GPU_DRIVER=none
|
||||||
|
|
||||||
|
# System-wide proxy settings
|
||||||
|
# - Do not modify, you must use dietpi-config > "Network Options: Adapters" to apply
|
||||||
|
CONFIG_PROXY_ADDRESS=MyProxyServer.com
|
||||||
|
CONFIG_PROXY_PORT=8080
|
||||||
|
CONFIG_PROXY_USERNAME=
|
||||||
|
CONFIG_PROXY_PASSWORD=
|
||||||
|
|
||||||
|
CONFIG_G_CHECK_URL_TIMEOUT=10
|
||||||
|
CONFIG_G_CHECK_URL_ATTEMPTS=2
|
||||||
|
CONFIG_CHECK_CONNECTION_IP=9.9.9.9
|
||||||
|
CONFIG_CHECK_CONNECTION_IPV6=2620:fe::fe
|
||||||
|
CONFIG_CHECK_DNS_DOMAIN=dietpi.com
|
||||||
|
CONFIG_CHECK_DIETPI_UPDATES=1
|
||||||
|
CONFIG_CHECK_APT_UPDATES=2
|
||||||
|
CONFIG_NTP_MODE=4
|
||||||
|
CONFIG_SOUNDCARD=none
|
||||||
|
CONFIG_LCDPANEL=none
|
||||||
|
CONFIG_ENABLE_IPV6=0
|
||||||
|
CONFIG_APT_RASPBIAN_MIRROR=http://raspbian.raspberrypi.com/raspbian
|
||||||
|
CONFIG_APT_DEBIAN_MIRROR=https://deb.debian.org/debian
|
||||||
|
CONFIG_NTP_MIRROR=default
|
||||||
|
SOFTWARE_DISABLE_SSH_PASSWORD_LOGINS=1
|
||||||
|
SOFTWARE_WIREGUARD_MODE=Server
|
||||||
|
SOFTWARE_WIREGUARD_PORT=51820
|
||||||
|
SOFTWARE_VNCSERVER_WIDTH=1280
|
||||||
|
SOFTWARE_VNCSERVER_HEIGHT=720
|
||||||
|
SOFTWARE_VNCSERVER_DEPTH=16
|
||||||
|
SOFTWARE_VNCSERVER_DISPLAY_INDEX=1
|
||||||
|
SOFTWARE_VNCSERVER_SHARE_DESKTOP=0
|
||||||
|
SOFTWARE_NEXTCLOUD_USERNAME=admin
|
||||||
|
SOFTWARE_NEXTCLOUD_DATADIR=/mnt/dietpi_userdata/nextcloud_data
|
||||||
|
SOFTWARE_SYNAPSE_USERNAME=dietpi
|
||||||
|
SOFTWARE_WIFI_HOTSPOT_SSID=DietPi-HotSpot
|
||||||
|
SOFTWARE_WIFI_HOTSPOT_KEY=dietpihotspot
|
||||||
|
SOFTWARE_WIFI_HOTSPOT_CHANNEL=3
|
||||||
|
SOFTWARE_WIFI_HOTSPOT_WIFI4=0
|
||||||
|
SOFTWARE_WIFI_HOTSPOT_WIFI5=0
|
||||||
|
SOFTWARE_WIFI_HOTSPOT_WIFI6=0
|
||||||
|
SOFTWARE_WIFI_HOTSPOT_5G=0
|
||||||
|
SOFTWARE_WIFI_HOTSPOT_5G_CHANNEL=36
|
||||||
|
SOFTWARE_XORG_DPI=96
|
||||||
|
SOFTWARE_CHROMIUM_RES_X=1280
|
||||||
|
SOFTWARE_CHROMIUM_RES_Y=720
|
||||||
|
SOFTWARE_CHROMIUM_AUTOSTART_URL=https://dietpi.com/
|
||||||
|
SOFTWARE_HOMEASSISTANT_APT_DEPS=
|
||||||
|
SOFTWARE_HOMEASSISTANT_PIP_DEPS=
|
||||||
|
SOFTWARE_K3S_EXEC=
|
||||||
|
SOFTWARE_DIETPI_DASHBOARD_VERSION=Stable
|
||||||
|
SOFTWARE_DIETPI_DASHBOARD_BACKEND=0
|
||||||
|
SOFTWARE_ROONSERVER_EARLYACCESS=0
|
||||||
|
DEV_GITBRANCH=master
|
||||||
|
DEV_GITOWNER=MichaIng
|
||||||
|
|
||||||
|
# UrBackup Server
|
||||||
|
# - Backup path, optional, defaults to "/mnt/dietpi_userdata/urbackup", effective on fresh UrBackup Server installs only
|
||||||
|
SOFTWARE_URBACKUP_BACKUPPATH=/mnt/dietpi_userdata/urbackup
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/etc/.soupclown.env
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!.env
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/run/current-system/sw/bin/bash
|
|
||||||
|
|
||||||
SERVICE_NAMES=(
|
|
||||||
# "paperless"
|
|
||||||
# "immich"
|
|
||||||
"navidrome"
|
|
||||||
"downloadin"
|
|
||||||
# "matrix"
|
|
||||||
)
|
|
||||||
for SERVICE in "${SERVICE_NAMES[@]}"; do
|
|
||||||
docker compose --env-file /etc/.soupclown.env -f $(pwd)/${SERVICE}-compose.yaml down
|
|
||||||
done
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/run/current-system/sw/bin/bash
|
|
||||||
|
|
||||||
SERVICE_NAMES=(
|
|
||||||
# "paperless"
|
|
||||||
# "immich"
|
|
||||||
"navidrome"
|
|
||||||
"downloadin"
|
|
||||||
# "matrix"
|
|
||||||
)
|
|
||||||
for SERVICE in "${SERVICE_NAMES[@]}"; do
|
|
||||||
docker compose --env-file /etc/.soupclown.env -f $(pwd)/${SERVICE}-compose.yaml pull
|
|
||||||
done
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/run/current-system/sw/bin/bash
|
|
||||||
|
|
||||||
SERVICE_NAMES=(
|
|
||||||
# "paperless"
|
|
||||||
# "immich"
|
|
||||||
"navidrome"
|
|
||||||
"downloadin"
|
|
||||||
# "matrix"
|
|
||||||
)
|
|
||||||
for SERVICE in "${SERVICE_NAMES[@]}"; do
|
|
||||||
docker compose --env-file /etc/.soupclown.env -f $(pwd)/${SERVICE}-compose.yaml up -d
|
|
||||||
done
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@@ -0,0 +1,315 @@
|
|||||||
|
services:
|
||||||
|
|
||||||
|
### START DOWNLOAD
|
||||||
|
vpn:
|
||||||
|
container_name: vpn
|
||||||
|
profiles:
|
||||||
|
- download
|
||||||
|
image: qmcgaw/gluetun:v3.40
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN # Quin does not like these
|
||||||
|
devices:
|
||||||
|
- /dev/net/tun:/dev/net/tun
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/gluetun:/gluetun
|
||||||
|
environment:
|
||||||
|
- VPN_SERVICE_PROVIDER=private internet access
|
||||||
|
- SERVER_REGIONS=Netherlands
|
||||||
|
- OPENVPN_USER=${PIA_USERNAME}
|
||||||
|
- OPENVPN_PASSWORD=${PIA_PASSWORD}
|
||||||
|
- UPDATER_PERIOD=24h
|
||||||
|
ports:
|
||||||
|
- 9091:9091 # Transmission
|
||||||
|
- 51413:51413 # Transmission
|
||||||
|
- 51413:51413/udp # Transmission
|
||||||
|
- 9696:9696 # Prowlarr
|
||||||
|
- 7878:7878 # Radarr
|
||||||
|
- 8989:8989 # Sonarr
|
||||||
|
- 8686:8686 # Lidarr
|
||||||
|
- 3333:3333 # bitmagnet API and WebUI port
|
||||||
|
- 3334:3334/tcp # bitmagnet BitTorrent ports
|
||||||
|
- 3334:3334/udp # bitmagnet BitTorrent ports
|
||||||
|
# - 5055:5055 # seerr
|
||||||
|
# - 8112:8112 # Deluge
|
||||||
|
# - 6881:6881 # Deluge
|
||||||
|
# - 6881:6881/udp # Deluge
|
||||||
|
# - 58846:58846 # idk Deluge
|
||||||
|
- 7474:7474 # Autobrr
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
transmission:
|
||||||
|
container_name: transmission
|
||||||
|
profiles:
|
||||||
|
- download
|
||||||
|
image: lscr.io/linuxserver/transmission:latest
|
||||||
|
network_mode: "service:vpn"
|
||||||
|
environment:
|
||||||
|
- TZ=${TZ}
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/transmission:/config
|
||||||
|
- /storage/transmission/downloads:/downloads
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
prowlarr:
|
||||||
|
container_name: prowlarr
|
||||||
|
profiles:
|
||||||
|
- download
|
||||||
|
image: lscr.io/linuxserver/prowlarr:latest
|
||||||
|
network_mode: "service:vpn"
|
||||||
|
environment:
|
||||||
|
- TZ=${TZ}
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/prowlarr:/config
|
||||||
|
depends_on:
|
||||||
|
vpn:
|
||||||
|
condition: service_started
|
||||||
|
restart: true
|
||||||
|
required: true
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
radarr:
|
||||||
|
container_name: radarr
|
||||||
|
profiles:
|
||||||
|
- download
|
||||||
|
image: lscr.io/linuxserver/radarr:latest
|
||||||
|
network_mode: "service:vpn"
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=${TZ}
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/radarr:/config
|
||||||
|
- /storage/media:/media # Access to media library
|
||||||
|
- /storage/transmission/downloads:/downloads # Access to transmission downloads
|
||||||
|
depends_on:
|
||||||
|
vpn:
|
||||||
|
condition: service_started
|
||||||
|
restart: true
|
||||||
|
required: true
|
||||||
|
prowlarr:
|
||||||
|
condition: service_started
|
||||||
|
restart: true
|
||||||
|
required: true
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
sonarr:
|
||||||
|
container_name: sonarr
|
||||||
|
profiles:
|
||||||
|
- download
|
||||||
|
image: lscr.io/linuxserver/sonarr:latest
|
||||||
|
network_mode: "service:vpn"
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=${TZ}
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/sonarr:/config
|
||||||
|
- /storage/media:/media # Access to media library
|
||||||
|
- /storage/transmission/downloads:/downloads # Access to transmission downloads
|
||||||
|
depends_on:
|
||||||
|
vpn:
|
||||||
|
condition: service_started
|
||||||
|
restart: true
|
||||||
|
required: true
|
||||||
|
prowlarr:
|
||||||
|
condition: service_started
|
||||||
|
restart: true
|
||||||
|
required: true
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
lidarr:
|
||||||
|
container_name: lidarr
|
||||||
|
profiles:
|
||||||
|
- download
|
||||||
|
image: lscr.io/linuxserver/lidarr:latest
|
||||||
|
network_mode: "service:vpn"
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=${TZ}
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/lidarr:/config
|
||||||
|
- /storage/media:/media # Access to media library
|
||||||
|
- /storage/transmission/downloads:/downloads # Access to transmission downloads
|
||||||
|
depends_on:
|
||||||
|
vpn:
|
||||||
|
condition: service_started
|
||||||
|
restart: true
|
||||||
|
required: true
|
||||||
|
prowlarr:
|
||||||
|
condition: service_started
|
||||||
|
restart: true
|
||||||
|
required: true
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
bitmagnet:
|
||||||
|
container_name: bitmagnet
|
||||||
|
profiles:
|
||||||
|
- download
|
||||||
|
image: ghcr.io/bitmagnet-io/bitmagnet:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
network_mode: "service:vpn"
|
||||||
|
environment:
|
||||||
|
- POSTGRES_PASSWORD=${BITMAGENT_DB_PASS}
|
||||||
|
- TMDB_API_KEY=${TMDB_API_KEY}
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/bitmagnet:/root/.config/bitmagnet
|
||||||
|
command:
|
||||||
|
- worker
|
||||||
|
- run
|
||||||
|
- --keys=http_server
|
||||||
|
- --keys=queue_server
|
||||||
|
# disable the next line to run without DHT crawler
|
||||||
|
- --keys=dht_crawler
|
||||||
|
depends_on:
|
||||||
|
postgres:
|
||||||
|
condition: service_healthy
|
||||||
|
|
||||||
|
postgres:
|
||||||
|
container_name: bitmagnet-postgres
|
||||||
|
profiles:
|
||||||
|
- download
|
||||||
|
image: postgres:16-alpine
|
||||||
|
network_mode: "service:vpn"
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/bitmagnet-postgres:/var/lib/postgresql/data
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
- POSTGRES_PASSWORD=${BITMAGENT_DB_PASS}
|
||||||
|
- POSTGRES_DB=bitmagnet
|
||||||
|
- PGUSER=postgres
|
||||||
|
shm_size: 1g
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD-SHELL
|
||||||
|
- pg_isready
|
||||||
|
start_period: 20s
|
||||||
|
interval: 10s
|
||||||
|
|
||||||
|
seerr:
|
||||||
|
container_name: seerr
|
||||||
|
profiles:
|
||||||
|
- download
|
||||||
|
image: ghcr.io/seerr-team/seerr:latest
|
||||||
|
init: true
|
||||||
|
ports:
|
||||||
|
- 5055:5055
|
||||||
|
environment:
|
||||||
|
- TZ=${TZ}
|
||||||
|
- LOG_LEVEL=debug
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/seer:/app/config
|
||||||
|
healthcheck:
|
||||||
|
test: wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/status || exit 1
|
||||||
|
start_period: 20s
|
||||||
|
timeout: 3s
|
||||||
|
interval: 15s
|
||||||
|
retries: 3
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
lidatube:
|
||||||
|
container_name: lidatube
|
||||||
|
profiles:
|
||||||
|
- download
|
||||||
|
image: thewicklowwolf/lidatube:latest
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/lidatube:/lidatube/config
|
||||||
|
- /storage/lidatube:/lidatube/downloads
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
environment:
|
||||||
|
- attempt_lidarr_import=True
|
||||||
|
ports:
|
||||||
|
- 5000:5000
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
aurral:
|
||||||
|
container_name: aurral
|
||||||
|
profiles:
|
||||||
|
- download
|
||||||
|
image: ghcr.io/lklynet/aurral:latest
|
||||||
|
ports:
|
||||||
|
- 3001:3001
|
||||||
|
environment:
|
||||||
|
- DOWNLOAD_FOLDER=${DL_FOLDER:-./data/downloads}
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/aurral:/app/backend/data
|
||||||
|
- /storage/aurral:/app/downloads
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
### END DOWNLOAD
|
||||||
|
|
||||||
|
### START APP
|
||||||
|
navidrome:
|
||||||
|
profiles:
|
||||||
|
- app
|
||||||
|
container_name: navidrome
|
||||||
|
image: deluan/navidrome:latest
|
||||||
|
user: 1000:1000
|
||||||
|
ports:
|
||||||
|
- "4533:4533"
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/navidrome:/data
|
||||||
|
- /storage/media/Music:/music
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
metube:
|
||||||
|
profiles:
|
||||||
|
- app
|
||||||
|
image: ghcr.io/alexta69/metube
|
||||||
|
container_name: metube
|
||||||
|
ports:
|
||||||
|
- "8081:8081"
|
||||||
|
volumes:
|
||||||
|
- ./bin/metube-options.json:/config/metube-options.json # Use config from repo :)
|
||||||
|
- /storage/metube/downloads:/downloads
|
||||||
|
environment:
|
||||||
|
- YTDL_OPTIONS_FILE=/config/metube-options.json
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
gitea:
|
||||||
|
profiles:
|
||||||
|
- app
|
||||||
|
container_name: gitea
|
||||||
|
image: docker.gitea.com/gitea:1.26.1
|
||||||
|
ports:
|
||||||
|
- 3000:3000
|
||||||
|
- 222:22
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/gitea-data:/data
|
||||||
|
- /etc/timezone:/etc/timezone:ro
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
environment:
|
||||||
|
- USER_UID=1000
|
||||||
|
- USER_GID=1000
|
||||||
|
- GITEA__database__DB_TYPE=postgres
|
||||||
|
- GITEA__database__NAME=gitea
|
||||||
|
- GITEA__database__USER=${GITEA_DB_USERNAME}
|
||||||
|
- GITEA__database__PASSWD=${GITEA_DB_PASSWORD}
|
||||||
|
- GITEA__database__HOST=giteadb:5432
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- giteadb
|
||||||
|
|
||||||
|
giteadb:
|
||||||
|
profiles:
|
||||||
|
- app
|
||||||
|
container_name: gitea-postgres
|
||||||
|
image: docker.io/library/postgres:14
|
||||||
|
environment:
|
||||||
|
- POSTGRES_USER=${GITEA_DB_USERNAME}
|
||||||
|
- POSTGRES_PASSWORD=${GITEA_DB_PASSWORD}
|
||||||
|
- POSTGRES_DB=gitea
|
||||||
|
volumes:
|
||||||
|
- ${PATH_ETC}/gitea-postgres:/var/lib/postgresql/data
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD-SHELL
|
||||||
|
- pg_isready
|
||||||
|
start_period: 20s
|
||||||
|
interval: 10s
|
||||||
|
restart: unless-stopped
|
||||||
|
### END APP
|
||||||
@@ -1,167 +0,0 @@
|
|||||||
services:
|
|
||||||
vpn:
|
|
||||||
container_name: vpn
|
|
||||||
image: qmcgaw/gluetun:v3.40
|
|
||||||
cap_add:
|
|
||||||
- NET_ADMIN # Quin does not like these
|
|
||||||
devices:
|
|
||||||
- /dev/net/tun:/dev/net/tun
|
|
||||||
volumes:
|
|
||||||
- ${DOWNLOAD_ETC_PATH}/gluetun:/gluetun
|
|
||||||
environment:
|
|
||||||
- VPN_SERVICE_PROVIDER=private internet access
|
|
||||||
- SERVER_REGIONS=Netherlands
|
|
||||||
- OPENVPN_USER=${PIA_USERNAME}
|
|
||||||
- OPENVPN_PASSWORD=${PIA_PASSWORD}
|
|
||||||
- UPDATER_PERIOD=24h
|
|
||||||
ports:
|
|
||||||
- 9091:9091 # Transmission
|
|
||||||
- 51413:51413 # Transmission
|
|
||||||
- 51413:51413/udp # Transmission
|
|
||||||
- 9696:9696 # Prowlarr
|
|
||||||
- 7878:7878 # Radarr
|
|
||||||
- 8989:8989 # Sonarr
|
|
||||||
- 3333:3333 # bitmagnet API and WebUI port
|
|
||||||
- 3334:3334/tcp # bitmagnet BitTorrent ports
|
|
||||||
- 3334:3334/udp # bitmagnet BitTorrent ports
|
|
||||||
# - 5055:5055 # seerr
|
|
||||||
# - 8112:8112 # Deluge
|
|
||||||
# - 6881:6881 # Deluge
|
|
||||||
# - 6881:6881/udp # Deluge
|
|
||||||
# - 58846:58846 # idk Deluge
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
transmission:
|
|
||||||
image: lscr.io/linuxserver/transmission:latest
|
|
||||||
container_name: transmission
|
|
||||||
network_mode: "service:vpn"
|
|
||||||
environment:
|
|
||||||
- TZ=${TZ}
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
volumes:
|
|
||||||
- ${DOWNLOAD_ETC_PATH}/transmission:/config
|
|
||||||
- ${DOWNLOAD_IN_PROGRESS_PATH}:/downloads
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
prowlarr:
|
|
||||||
container_name: prowlarr
|
|
||||||
image: lscr.io/linuxserver/prowlarr:latest
|
|
||||||
network_mode: "service:vpn"
|
|
||||||
environment:
|
|
||||||
- TZ=${TZ}
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
volumes:
|
|
||||||
- ${DOWNLOAD_ETC_PATH}/prowlarr:/config
|
|
||||||
depends_on:
|
|
||||||
vpn:
|
|
||||||
condition: service_started
|
|
||||||
restart: true
|
|
||||||
required: true
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
radarr:
|
|
||||||
image: lscr.io/linuxserver/radarr:latest
|
|
||||||
network_mode: "service:vpn"
|
|
||||||
container_name: radarr
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=${TZ}
|
|
||||||
volumes:
|
|
||||||
- ${DOWNLOAD_ETC_PATH}/radarr:/config
|
|
||||||
- /mnt/tmpMedia/app_data/transmission/downloads/incomplete:/downloads/incomplete #optional
|
|
||||||
- /mnt/tmpMedia/app_data/jellyfin/media:/soupclown/localmedia
|
|
||||||
depends_on:
|
|
||||||
vpn:
|
|
||||||
condition: service_started
|
|
||||||
restart: true
|
|
||||||
required: true
|
|
||||||
prowlarr:
|
|
||||||
condition: service_started
|
|
||||||
restart: true
|
|
||||||
required: true
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
sonarr:
|
|
||||||
image: lscr.io/linuxserver/sonarr:latest
|
|
||||||
network_mode: "service:vpn"
|
|
||||||
container_name: sonarr
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=${TZ}
|
|
||||||
volumes:
|
|
||||||
- ${DOWNLOAD_ETC_PATH}/sonarr:/config
|
|
||||||
- /mnt/tmpMedia/app_data/jellyfin/media:/soupclown/localmedia
|
|
||||||
- /mnt/tmpMedia/app_data/transmission/downloads/incomplete:/downloads/incomplete #optional
|
|
||||||
depends_on:
|
|
||||||
vpn:
|
|
||||||
condition: service_started
|
|
||||||
restart: true
|
|
||||||
required: true
|
|
||||||
prowlarr:
|
|
||||||
condition: service_started
|
|
||||||
restart: true
|
|
||||||
required: true
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
bitmagnet:
|
|
||||||
image: ghcr.io/bitmagnet-io/bitmagnet:latest
|
|
||||||
container_name: bitmagnet
|
|
||||||
restart: unless-stopped
|
|
||||||
network_mode: "service:vpn"
|
|
||||||
environment:
|
|
||||||
- POSTGRES_PASSWORD=${DOWNLOAD_BITMAGENT_DB_PASS}
|
|
||||||
- TMDB_API_KEY=${TMDB_API_KEY}
|
|
||||||
volumes:
|
|
||||||
- ${SOUPCLOWN_ETC_PATH}/downloadin/bitmagnet/etc:/root/.config/bitmagnet
|
|
||||||
command:
|
|
||||||
- worker
|
|
||||||
- run
|
|
||||||
- --keys=http_server
|
|
||||||
- --keys=queue_server
|
|
||||||
# disable the next line to run without DHT crawler
|
|
||||||
- --keys=dht_crawler
|
|
||||||
depends_on:
|
|
||||||
postgres:
|
|
||||||
condition: service_healthy
|
|
||||||
|
|
||||||
postgres:
|
|
||||||
image: postgres:16-alpine
|
|
||||||
container_name: bitmagnet-postgres
|
|
||||||
network_mode: "service:vpn"
|
|
||||||
volumes:
|
|
||||||
- ${SOUPCLOWN_ETC_PATH}/downloadin/bitmagnet/postgresdata:/var/lib/postgresql/data
|
|
||||||
restart: unless-stopped
|
|
||||||
environment:
|
|
||||||
- POSTGRES_PASSWORD=${DOWNLOAD_BITMAGENT_DB_PASS}
|
|
||||||
- POSTGRES_DB=bitmagnet
|
|
||||||
- PGUSER=postgres
|
|
||||||
shm_size: 1g
|
|
||||||
healthcheck:
|
|
||||||
test:
|
|
||||||
- CMD-SHELL
|
|
||||||
- pg_isready
|
|
||||||
start_period: 20s
|
|
||||||
interval: 10s
|
|
||||||
|
|
||||||
seerr:
|
|
||||||
image: ghcr.io/seerr-team/seerr:latest
|
|
||||||
init: true
|
|
||||||
container_name: seerr
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- 5055:5055
|
|
||||||
environment:
|
|
||||||
- TZ=${TZ}
|
|
||||||
- LOG_LEVEL=debug
|
|
||||||
volumes:
|
|
||||||
- ${SOUPCLOWN_ETC_PATH}/seer:/app/config
|
|
||||||
healthcheck:
|
|
||||||
test: wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/status || exit 1
|
|
||||||
start_period: 20s
|
|
||||||
timeout: 3s
|
|
||||||
interval: 15s
|
|
||||||
retries: 3
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
#
|
|
||||||
# WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose
|
|
||||||
#
|
|
||||||
# Make sure to use the docker-compose.yml of the current release:
|
|
||||||
#
|
|
||||||
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
|
|
||||||
#
|
|
||||||
# The compose file on main may not be compatible with the latest release.
|
|
||||||
|
|
||||||
name: immich
|
|
||||||
|
|
||||||
services:
|
|
||||||
immich-server:
|
|
||||||
container_name: immich-server
|
|
||||||
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
|
|
||||||
# extends:
|
|
||||||
# file: hwaccel.transcoding.yml
|
|
||||||
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
|
|
||||||
volumes:
|
|
||||||
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of IMMICH_UPLOAD_LOCATION in the .env file
|
|
||||||
- ${IMMICH_UPLOAD_LOCATION}:/data
|
|
||||||
- /mnt/mega/immich/old-album:/old-album
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
|
||||||
env_file:
|
|
||||||
- /etc/.soupclown.env
|
|
||||||
ports:
|
|
||||||
- "2283:2283"
|
|
||||||
depends_on:
|
|
||||||
- redis
|
|
||||||
- database
|
|
||||||
restart: always
|
|
||||||
healthcheck:
|
|
||||||
disable: false
|
|
||||||
|
|
||||||
immich-machine-learning:
|
|
||||||
container_name: immich-machine-learning
|
|
||||||
# For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
|
|
||||||
# Example tag: ${IMMICH_VERSION:-release}-cuda
|
|
||||||
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
|
|
||||||
# extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration
|
|
||||||
# file: hwaccel.ml.yml
|
|
||||||
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
|
|
||||||
volumes:
|
|
||||||
- model-cache:/cache
|
|
||||||
env_file:
|
|
||||||
- /etc/.soupclown.env
|
|
||||||
restart: always
|
|
||||||
healthcheck:
|
|
||||||
disable: false
|
|
||||||
|
|
||||||
redis:
|
|
||||||
container_name: immich-redis
|
|
||||||
image: docker.io/valkey/valkey:9@sha256:fb8d272e529ea567b9bf1302245796f21a2672b8368ca3fcb938ac334e613c8f
|
|
||||||
healthcheck:
|
|
||||||
test: redis-cli ping || exit 1
|
|
||||||
restart: always
|
|
||||||
|
|
||||||
database:
|
|
||||||
container_name: immich-postgres
|
|
||||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
|
|
||||||
environment:
|
|
||||||
POSTGRES_PASSWORD: ${IMMICH_DB_PASSWORD}
|
|
||||||
POSTGRES_USER: ${IMMICH_DB_USERNAME}
|
|
||||||
POSTGRES_DB: ${IMMICH_DB_DATABASE_NAME}
|
|
||||||
POSTGRES_INITDB_ARGS: "--data-checksums"
|
|
||||||
# Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
|
|
||||||
# DB_STORAGE_TYPE: 'HDD'
|
|
||||||
volumes:
|
|
||||||
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of IMMICH_DB_DATA_LOCATION in the .env file
|
|
||||||
- ${IMMICH_DB_DATA_LOCATION}:/var/lib/postgresql/data
|
|
||||||
shm_size: 128mb
|
|
||||||
restart: always
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
model-cache:
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
services:
|
|
||||||
navidrome:
|
|
||||||
container_name: navidrome
|
|
||||||
image: deluan/navidrome:latest
|
|
||||||
user: 1000:1000
|
|
||||||
ports:
|
|
||||||
- "4533:4533"
|
|
||||||
volumes:
|
|
||||||
- /root/navidrome:/data
|
|
||||||
- /mnt/mega/beetsMusic:/music
|
|
||||||
restart: unless-stopped
|
|
||||||
@@ -25,16 +25,15 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1716729631,
|
"lastModified": 1776950293,
|
||||||
"narHash": "sha256-IerjU5GUeKc0eW9FPOdlPveSGJ2ZrO+lIfuHPUmUF2I=",
|
"narHash": "sha256-t6KMARLILjPuTBSRoYanUxV+FU50IFZ7L5XVdOcdtaY=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "fc4492181833eaaa7a26a8081c0615d95792d825",
|
"rev": "6837e0d6c5eda81fd26308489799fbf83a160465",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"ref": "release-23.05",
|
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,13 +8,23 @@
|
|||||||
import-tree.url = "github:vic/import-tree";
|
import-tree.url = "github:vic/import-tree";
|
||||||
|
|
||||||
home-manager = {
|
home-manager = {
|
||||||
url = "github:nix-community/home-manager/release-23.05";
|
url = "github:nix-community/home-manager";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = inputs@{ flake-parts, nixos-hardware, import-tree, nixpkgs, ... }:
|
outputs = inputs@{
|
||||||
flake-parts.lib.mkFlake { inherit inputs; } (top@{ config, withSystem, moduleWithSystem, ... }: {
|
flake-parts,
|
||||||
|
nixos-hardware,
|
||||||
|
import-tree,
|
||||||
|
home-manager,
|
||||||
|
nixpkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||||
|
imports = [
|
||||||
|
inputs.home-manager.flakeModules.home-manager
|
||||||
|
];
|
||||||
flake = {
|
flake = {
|
||||||
nixosConfigurations.qmoran-laptop = nixpkgs.lib.nixosSystem {
|
nixosConfigurations.qmoran-laptop = nixpkgs.lib.nixosSystem {
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
@@ -36,7 +46,7 @@
|
|||||||
systems = [
|
systems = [
|
||||||
"x86_64-linux"
|
"x86_64-linux"
|
||||||
];
|
];
|
||||||
});
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,5 +38,6 @@
|
|||||||
git
|
git
|
||||||
tailscale
|
tailscale
|
||||||
rclone
|
rclone
|
||||||
|
mergerfs
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -35,6 +35,9 @@
|
|||||||
screen
|
screen
|
||||||
jellyfin-desktop
|
jellyfin-desktop
|
||||||
renpy
|
renpy
|
||||||
|
bun
|
||||||
|
wine
|
||||||
|
beets
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -30,13 +30,26 @@
|
|||||||
options = [ "fmask=0077" "dmask=0077" ];
|
options = [ "fmask=0077" "dmask=0077" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
fileSystems."/mnt/tmpMedia" =
|
fileSystems."/mnt/disks/disk1" =
|
||||||
{
|
{
|
||||||
device = "/dev/disk/by-uuid/fa20e116-e04e-4f3e-bf5a-c2e2c1fad610";
|
device = "/dev/disk/by-uuid/fa20e116-e04e-4f3e-bf5a-c2e2c1fad610";
|
||||||
fsType = "ext4";
|
fsType = "ext4";
|
||||||
options = ["noatime" "nodiratime" "noauto"];
|
options = ["noatime" "nodiratime"];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fileSystems."/mnt/disks/disk2" =
|
||||||
|
{
|
||||||
|
device = "/dev/disk/by-uuid/887500d5-1d4d-4080-84e3-5ef424c9f310";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = ["noatime" "nodiratime"];
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/storage" = {
|
||||||
|
fsType = "fuse.mergerfs";
|
||||||
|
device = "/mnt/disks/*";
|
||||||
|
options = ["cache.files=partial" "dropcacheonclose=true" "category.create=mfs"];
|
||||||
|
};
|
||||||
|
|
||||||
swapDevices =
|
swapDevices =
|
||||||
[ { device = "/dev/disk/by-uuid/cf4cff49-15d7-4145-86c2-8be30e71fe4c"; }
|
[ { device = "/dev/disk/by-uuid/cf4cff49-15d7-4145-86c2-8be30e71fe4c"; }
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
#renpy assets for localdev
|
|
||||||
cache/
|
|
||||||
saves/
|
|
||||||
log.txt
|
|
||||||
traceback.txt
|
|
||||||
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Directories that Ren'Py changes files in.
|
|
||||||
/game/saves
|
|
||||||
/game/cache
|
|
||||||
|
|
||||||
# Compiled script files. These are important for saving, and so should
|
|
||||||
# be preserved by developer and build systems after the game has been released.
|
|
||||||
/game/**/*.rpyc
|
|
||||||
/game/**/*.rpymc
|
|
||||||
|
|
||||||
# Files Ren'Py can generate.
|
|
||||||
/game/**/*.bak
|
|
||||||
/game/**/*.new
|
|
||||||
/game/**/*.old
|
|
||||||
|
|
||||||
# Error, log, and output files.
|
|
||||||
/errors.txt
|
|
||||||
/files.txt
|
|
||||||
/image_cache.txt
|
|
||||||
/log.txt
|
|
||||||
/save_dump.txt
|
|
||||||
/traceback.txt
|
|
||||||
|
|
||||||
# Launcher-generated files.
|
|
||||||
/dialogue.tab
|
|
||||||
/dialogue.txt
|
|
||||||
/strings.json
|
|
||||||
@@ -1,480 +0,0 @@
|
|||||||
################################################################################
|
|
||||||
## Initialization
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
## The init offset statement causes the initialization statements in this file
|
|
||||||
## to run before init statements in any other file.
|
|
||||||
init offset = -2
|
|
||||||
|
|
||||||
## Calling gui.init resets the styles to sensible default values, and sets the
|
|
||||||
## width and height of the game.
|
|
||||||
init python:
|
|
||||||
gui.init(1920, 1080)
|
|
||||||
|
|
||||||
## Enable checks for invalid or unstable properties in screens or transforms
|
|
||||||
define config.check_conflicting_properties = True
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## GUI Configuration Variables
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
|
|
||||||
## Colors ######################################################################
|
|
||||||
##
|
|
||||||
## The colors of text in the interface.
|
|
||||||
|
|
||||||
## An accent color used throughout the interface to label and highlight text.
|
|
||||||
define gui.accent_color = '#cc6600'
|
|
||||||
|
|
||||||
## The color used for a text button when it is neither selected nor hovered.
|
|
||||||
define gui.idle_color = '#888888'
|
|
||||||
|
|
||||||
## The small color is used for small text, which needs to be brighter/darker to
|
|
||||||
## achieve the same effect.
|
|
||||||
define gui.idle_small_color = '#aaaaaa'
|
|
||||||
|
|
||||||
## The color that is used for buttons and bars that are hovered.
|
|
||||||
define gui.hover_color = '#e0a366'
|
|
||||||
|
|
||||||
## The color used for a text button when it is selected but not focused. A
|
|
||||||
## button is selected if it is the current screen or preference value.
|
|
||||||
define gui.selected_color = '#ffffff'
|
|
||||||
|
|
||||||
## The color used for a text button when it cannot be selected.
|
|
||||||
define gui.insensitive_color = '#8888887f'
|
|
||||||
|
|
||||||
## Colors used for the portions of bars that are not filled in. These are not
|
|
||||||
## used directly, but are used when re-generating bar image files.
|
|
||||||
define gui.muted_color = '#512800'
|
|
||||||
define gui.hover_muted_color = '#7a3d00'
|
|
||||||
|
|
||||||
## The colors used for dialogue and menu choice text.
|
|
||||||
define gui.text_color = '#ffffff'
|
|
||||||
define gui.interface_text_color = '#ffffff'
|
|
||||||
|
|
||||||
|
|
||||||
## Fonts and Font Sizes ########################################################
|
|
||||||
|
|
||||||
## The font used for in-game text.
|
|
||||||
define gui.text_font = "DejaVuSans.ttf"
|
|
||||||
|
|
||||||
## The font used for character names.
|
|
||||||
define gui.name_text_font = "DejaVuSans.ttf"
|
|
||||||
|
|
||||||
## The font used for out-of-game text.
|
|
||||||
define gui.interface_text_font = "DejaVuSans.ttf"
|
|
||||||
|
|
||||||
## The size of normal dialogue text.
|
|
||||||
define gui.text_size = 33
|
|
||||||
|
|
||||||
## The size of character names.
|
|
||||||
define gui.name_text_size = 45
|
|
||||||
|
|
||||||
## The size of text in the game's user interface.
|
|
||||||
define gui.interface_text_size = 33
|
|
||||||
|
|
||||||
## The size of labels in the game's user interface.
|
|
||||||
define gui.label_text_size = 36
|
|
||||||
|
|
||||||
## The size of text on the notify screen.
|
|
||||||
define gui.notify_text_size = 24
|
|
||||||
|
|
||||||
## The size of the game's title.
|
|
||||||
define gui.title_text_size = 75
|
|
||||||
|
|
||||||
|
|
||||||
## Main and Game Menus #########################################################
|
|
||||||
|
|
||||||
## The images used for the main and game menus.
|
|
||||||
define gui.main_menu_background = "gui/main_menu.png"
|
|
||||||
define gui.game_menu_background = "gui/game_menu.png"
|
|
||||||
|
|
||||||
|
|
||||||
## Dialogue ####################################################################
|
|
||||||
##
|
|
||||||
## These variables control how dialogue is displayed on the screen one line at
|
|
||||||
## a time.
|
|
||||||
|
|
||||||
## The height of the textbox containing dialogue.
|
|
||||||
define gui.textbox_height = 278
|
|
||||||
|
|
||||||
## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5
|
|
||||||
## is center, and 1.0 is the bottom.
|
|
||||||
define gui.textbox_yalign = 1.0
|
|
||||||
|
|
||||||
|
|
||||||
## The placement of the speaking character's name, relative to the textbox.
|
|
||||||
## These can be a whole number of pixels from the left or top, or 0.5 to center.
|
|
||||||
define gui.name_xpos = 360
|
|
||||||
define gui.name_ypos = 0
|
|
||||||
|
|
||||||
## The horizontal alignment of the character's name. This can be 0.0 for left-
|
|
||||||
## aligned, 0.5 for centered, and 1.0 for right-aligned.
|
|
||||||
define gui.name_xalign = 0.0
|
|
||||||
|
|
||||||
## The width, height, and borders of the box containing the character's name,
|
|
||||||
## or None to automatically size it.
|
|
||||||
define gui.namebox_width = None
|
|
||||||
define gui.namebox_height = None
|
|
||||||
|
|
||||||
## The borders of the box containing the character's name, in left, top, right,
|
|
||||||
## bottom order.
|
|
||||||
define gui.namebox_borders = Borders(5, 5, 5, 5)
|
|
||||||
|
|
||||||
## If True, the background of the namebox will be tiled, if False, the
|
|
||||||
## background of the namebox will be scaled.
|
|
||||||
define gui.namebox_tile = False
|
|
||||||
|
|
||||||
|
|
||||||
## The placement of dialogue relative to the textbox. These can be a whole
|
|
||||||
## number of pixels relative to the left or top side of the textbox, or 0.5 to
|
|
||||||
## center.
|
|
||||||
define gui.dialogue_xpos = 402
|
|
||||||
define gui.dialogue_ypos = 75
|
|
||||||
|
|
||||||
## The maximum width of dialogue text, in pixels.
|
|
||||||
define gui.dialogue_width = 1116
|
|
||||||
|
|
||||||
## The horizontal alignment of the dialogue text. This can be 0.0 for left-
|
|
||||||
## aligned, 0.5 for centered, and 1.0 for right-aligned.
|
|
||||||
define gui.dialogue_text_xalign = 0.0
|
|
||||||
|
|
||||||
|
|
||||||
## Buttons #####################################################################
|
|
||||||
##
|
|
||||||
## These variables, along with the image files in gui/button, control aspects
|
|
||||||
## of how buttons are displayed.
|
|
||||||
|
|
||||||
## The width and height of a button, in pixels. If None, Ren'Py computes a size.
|
|
||||||
define gui.button_width = None
|
|
||||||
define gui.button_height = None
|
|
||||||
|
|
||||||
## The borders on each side of the button, in left, top, right, bottom order.
|
|
||||||
define gui.button_borders = Borders(6, 6, 6, 6)
|
|
||||||
|
|
||||||
## If True, the background image will be tiled. If False, the background image
|
|
||||||
## will be linearly scaled.
|
|
||||||
define gui.button_tile = False
|
|
||||||
|
|
||||||
## The font used by the button.
|
|
||||||
define gui.button_text_font = gui.interface_text_font
|
|
||||||
|
|
||||||
## The size of the text used by the button.
|
|
||||||
define gui.button_text_size = gui.interface_text_size
|
|
||||||
|
|
||||||
## The color of button text in various states.
|
|
||||||
define gui.button_text_idle_color = gui.idle_color
|
|
||||||
define gui.button_text_hover_color = gui.hover_color
|
|
||||||
define gui.button_text_selected_color = gui.selected_color
|
|
||||||
define gui.button_text_insensitive_color = gui.insensitive_color
|
|
||||||
|
|
||||||
## The horizontal alignment of the button text. (0.0 is left, 0.5 is center,
|
|
||||||
## 1.0 is right).
|
|
||||||
define gui.button_text_xalign = 0.0
|
|
||||||
|
|
||||||
|
|
||||||
## These variables override settings for different kinds of buttons. Please see
|
|
||||||
## the gui documentation for the kinds of buttons available, and what each is
|
|
||||||
## used for.
|
|
||||||
##
|
|
||||||
## These customizations are used by the default interface:
|
|
||||||
|
|
||||||
define gui.radio_button_borders = Borders(27, 6, 6, 6)
|
|
||||||
|
|
||||||
define gui.check_button_borders = Borders(27, 6, 6, 6)
|
|
||||||
|
|
||||||
define gui.confirm_button_text_xalign = 0.5
|
|
||||||
|
|
||||||
define gui.page_button_borders = Borders(15, 6, 15, 6)
|
|
||||||
|
|
||||||
define gui.quick_button_borders = Borders(15, 6, 15, 0)
|
|
||||||
define gui.quick_button_text_size = 21
|
|
||||||
define gui.quick_button_text_idle_color = gui.idle_small_color
|
|
||||||
define gui.quick_button_text_selected_color = gui.accent_color
|
|
||||||
|
|
||||||
## You can also add your own customizations, by adding properly-named
|
|
||||||
## variables. For example, you can uncomment the following line to set the width
|
|
||||||
## of a navigation button.
|
|
||||||
|
|
||||||
# define gui.navigation_button_width = 250
|
|
||||||
|
|
||||||
|
|
||||||
## Choice Buttons ##############################################################
|
|
||||||
##
|
|
||||||
## Choice buttons are used in the in-game menus.
|
|
||||||
|
|
||||||
define gui.choice_button_width = 1185
|
|
||||||
define gui.choice_button_height = None
|
|
||||||
define gui.choice_button_tile = False
|
|
||||||
define gui.choice_button_borders = Borders(150, 8, 150, 8)
|
|
||||||
define gui.choice_button_text_font = gui.text_font
|
|
||||||
define gui.choice_button_text_size = gui.text_size
|
|
||||||
define gui.choice_button_text_xalign = 0.5
|
|
||||||
define gui.choice_button_text_idle_color = '#888888'
|
|
||||||
define gui.choice_button_text_hover_color = "#ffffff"
|
|
||||||
define gui.choice_button_text_insensitive_color = '#8888887f'
|
|
||||||
|
|
||||||
|
|
||||||
## File Slot Buttons ###########################################################
|
|
||||||
##
|
|
||||||
## A file slot button is a special kind of button. It contains a thumbnail
|
|
||||||
## image, and text describing the contents of the save slot. A save slot uses
|
|
||||||
## image files in gui/button, like the other kinds of buttons.
|
|
||||||
|
|
||||||
## The save slot button.
|
|
||||||
define gui.slot_button_width = 414
|
|
||||||
define gui.slot_button_height = 309
|
|
||||||
define gui.slot_button_borders = Borders(15, 15, 15, 15)
|
|
||||||
define gui.slot_button_text_size = 21
|
|
||||||
define gui.slot_button_text_xalign = 0.5
|
|
||||||
define gui.slot_button_text_idle_color = gui.idle_small_color
|
|
||||||
define gui.slot_button_text_selected_idle_color = gui.selected_color
|
|
||||||
define gui.slot_button_text_selected_hover_color = gui.hover_color
|
|
||||||
|
|
||||||
## The width and height of thumbnails used by the save slots.
|
|
||||||
define config.thumbnail_width = 384
|
|
||||||
define config.thumbnail_height = 216
|
|
||||||
|
|
||||||
## The number of columns and rows in the grid of save slots.
|
|
||||||
define gui.file_slot_cols = 3
|
|
||||||
define gui.file_slot_rows = 2
|
|
||||||
|
|
||||||
|
|
||||||
## Positioning and Spacing #####################################################
|
|
||||||
##
|
|
||||||
## These variables control the positioning and spacing of various user
|
|
||||||
## interface elements.
|
|
||||||
|
|
||||||
## The position of the left side of the navigation buttons, relative to the
|
|
||||||
## left side of the screen.
|
|
||||||
define gui.navigation_xpos = 60
|
|
||||||
|
|
||||||
## The vertical position of the skip indicator.
|
|
||||||
define gui.skip_ypos = 15
|
|
||||||
|
|
||||||
## The vertical position of the notify screen.
|
|
||||||
define gui.notify_ypos = 68
|
|
||||||
|
|
||||||
## The spacing between menu choices.
|
|
||||||
define gui.choice_spacing = 33
|
|
||||||
|
|
||||||
## Buttons in the navigation section of the main and game menus.
|
|
||||||
define gui.navigation_spacing = 6
|
|
||||||
|
|
||||||
## Controls the amount of spacing between preferences.
|
|
||||||
define gui.pref_spacing = 15
|
|
||||||
|
|
||||||
## Controls the amount of spacing between preference buttons.
|
|
||||||
define gui.pref_button_spacing = 0
|
|
||||||
|
|
||||||
## The spacing between file page buttons.
|
|
||||||
define gui.page_spacing = 0
|
|
||||||
|
|
||||||
## The spacing between file slots.
|
|
||||||
define gui.slot_spacing = 15
|
|
||||||
|
|
||||||
## The position of the main menu text.
|
|
||||||
define gui.main_menu_text_xalign = 1.0
|
|
||||||
|
|
||||||
|
|
||||||
## Frames ######################################################################
|
|
||||||
##
|
|
||||||
## These variables control the look of frames that can contain user interface
|
|
||||||
## components when an overlay or window is not present.
|
|
||||||
|
|
||||||
## Generic frames.
|
|
||||||
define gui.frame_borders = Borders(6, 6, 6, 6)
|
|
||||||
|
|
||||||
## The frame that is used as part of the confirm screen.
|
|
||||||
define gui.confirm_frame_borders = Borders(60, 60, 60, 60)
|
|
||||||
|
|
||||||
## The frame that is used as part of the skip screen.
|
|
||||||
define gui.skip_frame_borders = Borders(24, 8, 75, 8)
|
|
||||||
|
|
||||||
## The frame that is used as part of the notify screen.
|
|
||||||
define gui.notify_frame_borders = Borders(24, 8, 60, 8)
|
|
||||||
|
|
||||||
## Should frame backgrounds be tiled?
|
|
||||||
define gui.frame_tile = False
|
|
||||||
|
|
||||||
|
|
||||||
## Bars, Scrollbars, and Sliders ###############################################
|
|
||||||
##
|
|
||||||
## These control the look and size of bars, scrollbars, and sliders.
|
|
||||||
##
|
|
||||||
## The default GUI only uses sliders and vertical scrollbars. All of the other
|
|
||||||
## bars are only used in creator-written screens.
|
|
||||||
|
|
||||||
## The height of horizontal bars, scrollbars, and sliders. The width of
|
|
||||||
## vertical bars, scrollbars, and sliders.
|
|
||||||
define gui.bar_size = 38
|
|
||||||
define gui.scrollbar_size = 18
|
|
||||||
define gui.slider_size = 38
|
|
||||||
|
|
||||||
## True if bar images should be tiled. False if they should be linearly scaled.
|
|
||||||
define gui.bar_tile = False
|
|
||||||
define gui.scrollbar_tile = False
|
|
||||||
define gui.slider_tile = False
|
|
||||||
|
|
||||||
## Horizontal borders.
|
|
||||||
define gui.bar_borders = Borders(6, 6, 6, 6)
|
|
||||||
define gui.scrollbar_borders = Borders(6, 6, 6, 6)
|
|
||||||
define gui.slider_borders = Borders(6, 6, 6, 6)
|
|
||||||
|
|
||||||
## Vertical borders.
|
|
||||||
define gui.vbar_borders = Borders(6, 6, 6, 6)
|
|
||||||
define gui.vscrollbar_borders = Borders(6, 6, 6, 6)
|
|
||||||
define gui.vslider_borders = Borders(6, 6, 6, 6)
|
|
||||||
|
|
||||||
## What to do with unscrollable scrollbars in the game menu. "hide" hides them,
|
|
||||||
## while None shows them.
|
|
||||||
define gui.unscrollable = "hide"
|
|
||||||
|
|
||||||
|
|
||||||
## History #####################################################################
|
|
||||||
##
|
|
||||||
## The history screen displays dialogue that the player has already dismissed.
|
|
||||||
|
|
||||||
## The number of blocks of dialogue history Ren'Py will keep.
|
|
||||||
define config.history_length = 250
|
|
||||||
|
|
||||||
## The height of a history screen entry, or None to make the height variable at
|
|
||||||
## the cost of performance.
|
|
||||||
define gui.history_height = 210
|
|
||||||
|
|
||||||
## Additional space to add between history screen entries.
|
|
||||||
define gui.history_spacing = 0
|
|
||||||
|
|
||||||
## The position, width, and alignment of the label giving the name of the
|
|
||||||
## speaking character.
|
|
||||||
define gui.history_name_xpos = 233
|
|
||||||
define gui.history_name_ypos = 0
|
|
||||||
define gui.history_name_width = 233
|
|
||||||
define gui.history_name_xalign = 1.0
|
|
||||||
|
|
||||||
## The position, width, and alignment of the dialogue text.
|
|
||||||
define gui.history_text_xpos = 255
|
|
||||||
define gui.history_text_ypos = 3
|
|
||||||
define gui.history_text_width = 1110
|
|
||||||
define gui.history_text_xalign = 0.0
|
|
||||||
|
|
||||||
|
|
||||||
## NVL-Mode ####################################################################
|
|
||||||
##
|
|
||||||
## The NVL-mode screen displays the dialogue spoken by NVL-mode characters.
|
|
||||||
|
|
||||||
## The borders of the background of the NVL-mode background window.
|
|
||||||
define gui.nvl_borders = Borders(0, 15, 0, 30)
|
|
||||||
|
|
||||||
## The maximum number of NVL-mode entries Ren'Py will display. When more
|
|
||||||
## entries than this are to be show, the oldest entry will be removed.
|
|
||||||
define gui.nvl_list_length = 6
|
|
||||||
|
|
||||||
## The height of an NVL-mode entry. Set this to None to have the entries
|
|
||||||
## dynamically adjust height.
|
|
||||||
define gui.nvl_height = 173
|
|
||||||
|
|
||||||
## The spacing between NVL-mode entries when gui.nvl_height is None, and
|
|
||||||
## between NVL-mode entries and an NVL-mode menu.
|
|
||||||
define gui.nvl_spacing = 15
|
|
||||||
|
|
||||||
## The position, width, and alignment of the label giving the name of the
|
|
||||||
## speaking character.
|
|
||||||
define gui.nvl_name_xpos = 645
|
|
||||||
define gui.nvl_name_ypos = 0
|
|
||||||
define gui.nvl_name_width = 225
|
|
||||||
define gui.nvl_name_xalign = 1.0
|
|
||||||
|
|
||||||
## The position, width, and alignment of the dialogue text.
|
|
||||||
define gui.nvl_text_xpos = 675
|
|
||||||
define gui.nvl_text_ypos = 12
|
|
||||||
define gui.nvl_text_width = 885
|
|
||||||
define gui.nvl_text_xalign = 0.0
|
|
||||||
|
|
||||||
## The position, width, and alignment of nvl_thought text (the text said by the
|
|
||||||
## nvl_narrator character.)
|
|
||||||
define gui.nvl_thought_xpos = 360
|
|
||||||
define gui.nvl_thought_ypos = 0
|
|
||||||
define gui.nvl_thought_width = 1170
|
|
||||||
define gui.nvl_thought_xalign = 0.0
|
|
||||||
|
|
||||||
## The position of nvl menu_buttons.
|
|
||||||
define gui.nvl_button_xpos = 675
|
|
||||||
define gui.nvl_button_xalign = 0.0
|
|
||||||
|
|
||||||
|
|
||||||
## Localization ################################################################
|
|
||||||
|
|
||||||
## This controls where a line break is permitted. The default is suitable
|
|
||||||
## for most languages. A list of available values can be found at https://
|
|
||||||
## www.renpy.org/doc/html/style_properties.html#style-property-language
|
|
||||||
|
|
||||||
define gui.language = "unicode"
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## Mobile devices
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
init python:
|
|
||||||
|
|
||||||
## This increases the size of the quick buttons to make them easier to
|
|
||||||
## touch on tablets and phones.
|
|
||||||
@gui.variant
|
|
||||||
def touch():
|
|
||||||
|
|
||||||
gui.quick_button_borders = Borders(60, 21, 60, 0)
|
|
||||||
|
|
||||||
## This changes the size and spacing of various GUI elements to ensure they
|
|
||||||
## are easily visible on phones.
|
|
||||||
@gui.variant
|
|
||||||
def small():
|
|
||||||
|
|
||||||
## Font sizes.
|
|
||||||
gui.text_size = 45
|
|
||||||
gui.name_text_size = 54
|
|
||||||
gui.notify_text_size = 38
|
|
||||||
gui.interface_text_size = 45
|
|
||||||
gui.button_text_size = 45
|
|
||||||
gui.label_text_size = 51
|
|
||||||
|
|
||||||
## Adjust the location of the textbox.
|
|
||||||
gui.textbox_height = 360
|
|
||||||
gui.name_xpos = 120
|
|
||||||
gui.dialogue_xpos = 135
|
|
||||||
gui.dialogue_width = 1650
|
|
||||||
|
|
||||||
## Change the size and spacing of various things.
|
|
||||||
gui.slider_size = 54
|
|
||||||
|
|
||||||
gui.choice_button_width = 1860
|
|
||||||
gui.choice_button_text_size = 45
|
|
||||||
|
|
||||||
gui.navigation_spacing = 30
|
|
||||||
gui.pref_button_spacing = 15
|
|
||||||
|
|
||||||
gui.history_height = 285
|
|
||||||
gui.history_text_width = 1035
|
|
||||||
|
|
||||||
gui.quick_button_text_size = 30
|
|
||||||
|
|
||||||
## File button layout.
|
|
||||||
gui.file_slot_cols = 2
|
|
||||||
gui.file_slot_rows = 2
|
|
||||||
|
|
||||||
## NVL-mode.
|
|
||||||
gui.nvl_height = 255
|
|
||||||
|
|
||||||
gui.nvl_name_width = 458
|
|
||||||
gui.nvl_name_xpos = 488
|
|
||||||
|
|
||||||
gui.nvl_text_width = 1373
|
|
||||||
gui.nvl_text_xpos = 518
|
|
||||||
gui.nvl_text_ypos = 8
|
|
||||||
|
|
||||||
gui.nvl_thought_width = 1860
|
|
||||||
gui.nvl_thought_xpos = 30
|
|
||||||
|
|
||||||
gui.nvl_button_width = 1860
|
|
||||||
gui.nvl_button_xpos = 30
|
|
||||||
|
Before Width: | Height: | Size: 838 B |
|
Before Width: | Height: | Size: 522 B |
|
Before Width: | Height: | Size: 522 B |
|
Before Width: | Height: | Size: 838 B |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 104 B |
|
Before Width: | Height: | Size: 160 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 465 B |
|
Before Width: | Height: | Size: 465 B |
|
Before Width: | Height: | Size: 198 B |
|
Before Width: | Height: | Size: 198 B |
|
Before Width: | Height: | Size: 104 B |
|
Before Width: | Height: | Size: 160 B |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 503 B |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 838 B |
|
Before Width: | Height: | Size: 522 B |
|
Before Width: | Height: | Size: 522 B |
|
Before Width: | Height: | Size: 838 B |
|
Before Width: | Height: | Size: 111 B |
|
Before Width: | Height: | Size: 178 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 583 B |
|
Before Width: | Height: | Size: 583 B |
|
Before Width: | Height: | Size: 111 B |
|
Before Width: | Height: | Size: 178 B |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 462 B |
|
Before Width: | Height: | Size: 465 B |
|
Before Width: | Height: | Size: 464 B |
|
Before Width: | Height: | Size: 462 B |
|
Before Width: | Height: | Size: 803 B |
|
Before Width: | Height: | Size: 805 B |
|
Before Width: | Height: | Size: 804 B |
|
Before Width: | Height: | Size: 803 B |
|
Before Width: | Height: | Size: 702 B |
|
Before Width: | Height: | Size: 141 B |
|
Before Width: | Height: | Size: 703 B |
|
Before Width: | Height: | Size: 139 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 146 B |