better readme

This commit is contained in:
urania-dev
2024-02-27 00:26:09 +01:00
parent b9044b0d98
commit 454328e5ee
10 changed files with 361 additions and 172 deletions

View File

@@ -72,40 +72,57 @@ Read more and have docker compose in [announcement discussion](https://github.co
```yml
version: "3"
services:
redis-stack:
redis:
image: redis/redis-stack:latest
ports:
- 6379:6379/tcp
- 8001:8001
# ports: # you can specify LOCAL_IP OR VPN_IP to make db or redis insight available privately
# - (LOCAL_IP or VPN_IP):6379:6379/tcp
# - (LOCAL_IP or VPN_IP):8001:8001
volumes:
- /home/snapp/redis/test:/data:rw
- /home/snapp/redis/test:/data:rw
# this make sure to enable persistance through docker restarts
# and shutdowns or updates -- change it to a folder of your choise
- /etc/localtime:/etc/localtime:ro
networks:
- snapp-stack
environment:
REDIS_ARGS: "--save 60 1 --appendonly yes"
REDIS_ARGS: "--save 60 1 --appendonly yes" # Optional: `--requirepass mypassword`
snapp:
image: uraniadev/snapp:0.7.test
ports:
- 3000:3000
volumes:
- /home/snapp/app/translations:/app/translations:ro
# - /home/snapp/redis/theme/theme.css:/app/static/custom-theme.css
# See (Discussion about theming)[https://github.com/urania-dev/snapp/discussions/18]
networks:
- snapp-stack
environment:
AUTH_SECRET:
DB_HOST:
DB_PASS:
DB_PORT: 6379
DB_IDX: 0
ENABLE_LIMITS: false
ENABLE_SIGNUP: true
ENABLE_HOME: false
DEFAULT_THEME: dark
DEFAULT_LANG: en
LOCALIZATION_FOLDER: /app/translations
MAX_SHORT_URL: 10
MAX_USAGES: 0
MAX_RPM: 0
MAX_RPD: 0
VIRUSTOTAL_API_KEY:
PUBLIC_URL: https://example.com
ORIGIN: https://example.com
AUTH_SECRET: very-secure-and-long-pass-words # random string, generate it with bash: openssl rand -base64 32
DB_HOST: redis
# DB_PASS: # Optional: Requires `--requirepass mypassword` in REDIS_ARGS
# DB_PORT: 6379
# DB_IDX: 0
# ENABLE_LIMITS: false
# ENABLE_SIGNUP: true
# ENABLE_HOME: false
# DEFAULT_THEME: dark
# DEFAULT_LANG: en
# LOCALIZATION_FOLDER: /app/translations
# MAX_SHORT_URL: 10
# MAX_USAGES: 0
# MAX_RPM: 0
# MAX_RPD: 0
# UMAMI_WEBSITE_ID:
# UMAMI_URL:
# VIRUSTOTAL_API_KEY:
# PUBLIC_URL: http://host:5173
# ORIGIN: http://host:5173
## all commented vars are optional. Note that omitting PUBLIC_URL and ORIGIN it expects to be used from http://localhost:3000
networks:
snapp-stack: # Snapp Network so Snapp and redis can communicate but redis is isolated from the wan
external: false
```
## Migration

View File

@@ -27,6 +27,7 @@ import isBlackListedEmail from './users/isEmailBlackListed';
import trackMaxURLs from './settings/trackMaxURLs';
import trackRPDandRPM from './settings/trackRPDandRPM';
import hasWhiteList from './snapps/has_whitelist';
import checkRepoInfo from './repoInfo';
export const domainZList = 'settings:app:banlists:website' as const;
export const usernameZList = 'settings:app:banlists:username' as const;
@@ -47,32 +48,53 @@ export class Database {
this.snapps = new Repository(snappsSchema, redis);
this.apikeys = new Repository(apiKeysSchema, redis);
this.usages = new Repository(usagesSchema, redis);
signinUser.bind(this);
signupUser.bind(this);
updateUser.bind(this);
deleteUser.bind(this);
admin.bind(this);
shortenSnapp.bind(this);
editSnapp.bind(this);
authorship.bind(this);
getSetting.bind(this);
setSetting.bind(this);
checkRPMLimit.bind(this);
checkRPDLimit.bind(this);
trackMaxURLs.bind(this);
trackRPDandRPM.bind(this);
isWhiteListed.bind(this);
isBlackListed.bind(this);
isBlackListedEmail.bind(this);
hasWhiteList.bind(this);
checkRepoInfo.bind(this);
}
signinUser = signinUser.bind(this);
signupUser = signupUser.bind(this);
updateUser = updateUser.bind(this);
deleteUser = deleteUser.bind(this);
admin = admin.bind(this);
signinUser = signinUser;
signupUser = signupUser;
updateUser = updateUser;
deleteUser = deleteUser;
admin = admin;
shorten = shortenSnapp.bind(this);
edit = editSnapp.bind(this);
authorship = authorship.bind(this);
shorten = shortenSnapp;
edit = editSnapp;
authorship = authorship;
getSetting = getSetting.bind(this);
setSetting = setSetting.bind(this);
getSetting = getSetting;
setSetting = setSetting;
rpm = checkRPMLimit.bind(this);
rpd = checkRPDLimit.bind(this);
rpm = checkRPMLimit;
rpd = checkRPDLimit;
trackMaxURLs = trackMaxURLs.bind(this);
trackRPDandRPM = trackRPDandRPM.bind(this);
trackMaxURLs = trackMaxURLs;
trackRPDandRPM = trackRPDandRPM;
whitelisted = isWhiteListed.bind(this);
blacklisted = isBlackListed.bind(this);
blacklistedEmail = isBlackListedEmail.bind(this);
whitelisted = isWhiteListed;
blacklisted = isBlackListed;
blacklistedEmail = isBlackListedEmail;
hasWhiteList = hasWhiteList.bind(this);
hasWhiteList = hasWhiteList;
repoInfo = checkRepoInfo;
}
let password = env.DB_PASS ?? '';
@@ -89,7 +111,7 @@ async function getClient() {
console.log(err);
})
.connect();
else throw new Error('This version of Snapps requires REDIS STACK, please read documentation')
else throw new Error('This version of Snapps requires REDIS STACK, please read documentation');
}
const client = await getClient();

View File

@@ -0,0 +1,20 @@
import type { Database } from '..';
export default async function checkRepoInfo(
this: Database,
fetch: (input: string | URL | Request, init?: RequestInit | undefined) => Promise<Response>
) {
const key = `settings:repo:info`;
const stored = await this.redis.get(key);
if (stored) {
return JSON.parse(stored);
} else {
const repoInfo = await (await fetch('https://api.github.com/repos/urania-dev/snapp')).json();
await this.redis.set(key, JSON.stringify(repoInfo));
await this.redis.expire(key, 60 * 60 * 24);
return repoInfo;
}
}

View File

@@ -1,6 +1,4 @@
import getLanguage from '$lib/api/utils/getLanguage';
import parseNumber from '$lib/utils/parseNumber';
import { error } from '@sveltejs/kit';
import type { Database } from '..';
export default async function trackMaxURLs(this: Database, apiKey: DBAPIKey, _EN?: Translation) {
@@ -11,8 +9,6 @@ export default async function trackMaxURLs(this: Database, apiKey: DBAPIKey, _EN
);
if (!is_limited) return false;
const EN = _EN ? _EN : await getLanguage();
const global_limit_urls = await parseNumber(this.getSetting('settings:app:limits:max:urls'));
const user_limit = (

View File

@@ -1,6 +1,4 @@
import getLanguage from '$lib/api/utils/getLanguage';
import parseNumber from '$lib/utils/parseNumber';
import { error } from 'console';
import type { Database } from '..';
export default async function trackRPDandRPM(this: Database, apiKey: DBAPIKey, _EN?: Translation) {

View File

@@ -2,13 +2,15 @@ import { dev } from '$app/environment';
import { db } from '$lib/db/index.js';
import { redirect } from '@sveltejs/kit';
export async function load({ locals }) {
const session = await locals.getSession();
export async function load({ fetch }) {
const repoInfo = await db.repoInfo(fetch);
const disabled_home = await db
.getSetting('settings:app:home:enabled')
.then((res) => res === 'false');
if (disabled_home === true) throw redirect(302, '/dashboard');
return { repoInfo };
}
export const actions = {
@@ -27,7 +29,11 @@ export const actions = {
if (!session) return { success: true, theme: theme ?? 'dark' };
else {
if (session.user.id === undefined) return;
const user = await db.users.search().where('id').equalTo(session.user.id).first() as DBUser | null;
const user = (await db.users
.search()
.where('id')
.equalTo(session.user.id)
.first()) as DBUser | null;
if (user)
await db.updateUser({ ...user, settings: { ...user.settings, theme: theme ?? 'dark' } });
return { success: true, mode: theme ?? 'dark' };

View File

@@ -10,11 +10,14 @@
import AuthJSLogo from '$lib/logo/authjs.svg?raw';
import RedisLogo from '$lib/logo/redis.svg?raw';
import GitHubIcon from '$lib/logo/github.svg?raw';
import DockerHubIcon from '$lib/logo/docker.svg?raw';
import StarIcon from 'lucide-svelte/icons/star';
import StackIcon from 'lucide-svelte/icons/layers';
import FeaturesIcon from 'lucide-svelte/icons/award';
import CloneIcon from 'lucide-svelte/icons/copy-check';
import ContainerIcon from 'lucide-svelte/icons/container';
import CorsIcon from 'lucide-svelte/icons/shield-alert';
import DownloadIcon from 'lucide-svelte/icons/hard-drive-download';
import DevIcon from 'lucide-svelte/icons/keyboard';
import BuildIcon from 'lucide-svelte/icons/server-cog';
@@ -27,17 +30,44 @@
import { CodeBlock } from '@skeletonlabs/skeleton';
const { t } = getLocale();
const APPNAME = $t('global:appname');
export let data;
</script>
<svelte:head><title>{$t('global:appname')}</title></svelte:head>
<div class="page my-8 p-4">
<H1 class="flex items-end gap-2">
<div class="logo grid h-10 w-10 items-end justify-center">
{@html Logo}
<div class="page my-2 p-4">
<div class="flex items-center">
<H1 class="flex items-end gap-2 mb-5">
<div class="logo grid h-10 w-10 items-end justify-center">
{@html Logo}
</div>
{APPNAME}
</H1>
<div class="ms-auto links flex items-center gap-4">
<a
class="btn variant-outline-secondary hover:variant-ghost-secondary h-8 px-2"
href="https://github.com/urania-dev/snapp"
>
<div class="w-4 h-4 flex items-center">
{@html GitHubIcon}
</div>
<Small class="text-xs flex gap-2">
{data.repoInfo.stargazers_count}
<StarIcon class="w-4 h-4" fill="currentColor" />
</Small>
</a>
<a
class="btn variant-outline-secondary hover:variant-ghost-secondary h-8 px-2"
href="https://hub.docker.com/r/uraniadev/snapp"
>
<div class="w-4 h-4 flex items-center">
{@html DockerHubIcon}
</div>
<Small>Docker Image</Small>
</a>
</div>
{APPNAME}
</H1>
</div>
<Paragraph class="text-base max-w-xl ps-2">{$t('home:intro', { appname: APPNAME })}</Paragraph>
<div class="flex gap-4 w-full items-center mt-4">
@@ -132,129 +162,142 @@
</div>
<div class="grid lg:grid-cols-2 gap-4">
<div class="card">
<div class="card-header">
<Lead>{@html $t('home:manual:install')}</Lead>
</div>
<div class="card-body p-4 gap-2 flex flex-col">
<Paragraph class="flex gap-4 max-w-sm mt-[0!important]">
<div class="badge variant-glass-warning w-8 h-8">
<NodeJSIcon class="w-5 h-5 flex-shrink-0" />
</div>
{@html $t('home:manual:install:steps')}
</Paragraph>
<Paragraph class="flex gap-4 max-w-sm">
<div class="badge variant-glass-warning w-8 h-8">
<DBIcon class="w-4 h-4 flex-shrink-0" />
</div>
{@html $t('home:manual:install:redis')}
</Paragraph>
<Paragraph class="flex gap-4">
<div class="badge variant-glass-warning w-8 h-8">
<CloneIcon strokeWidth="2.25" class="w-4 h-4 flex-shrink-0" />
</div>
<span>
{@html $t('home:manual:install:clone:0')}
{@html $t('home:manual:install:clone:1')}
</span>
</Paragraph>
<Paragraph class="flex gap-4">
<div class="badge variant-glass-warning w-8 h-8">
<DownloadIcon class="w-4 h-4 flex-shrink-0" />
</div>
<span>
{@html $t('home:manual:install:download:0')}<br />
{@html $t('home:manual:install:download:1')}
</span>
</Paragraph>
<Paragraph class="flex gap-4">
<div class="badge variant-glass-warning w-8 h-8">
<KeyIcon class="w-4 h-4 flex-shrink-0" />
</div>
<span>
{@html $t('home:manual:install:env:0')}
{@html $t('home:manual:install:env:1')}
</span>
</Paragraph>
<Paragraph class="flex gap-4">
<div class="badge variant-glass-warning w-8 h-8">
<DevIcon class="w-4 h-4 flex-shrink-0" />
</div>
<span>
{@html $t('home:manual:install:dev:0')}<br />
{@html $t('home:manual:install:dev:1')}
</span>
</Paragraph>
<Paragraph class="flex gap-4">
<div class="badge variant-glass-warning w-8 h-8">
<BuildIcon class="w-4 h-4 flex-shrink-0" />
</div>
<span>
{@html $t('home:manual:install:build:0')}<br />
{@html $t('home:manual:install:build:1')}
</span>
</Paragraph>
<Paragraph class="flex gap-4 mb-4">
<div class="badge variant-glass-warning w-8 h-8">
<RunIcon class="w-4 h-4 flex-shrink-0" />
</div>
<span>
{@html $t('home:manual:install:run:0')}<br />
{@html $t('home:manual:install:run:1')}
</span>
</Paragraph>
</div>
</div>
<div class="flex flex-col gap-4">
<div class="card">
<div class="card-header">
<Lead>{@html $t('home:docker')}</Lead>
<Lead>{@html $t('home:manual:install')}</Lead>
</div>
<div class="card-body p-4 gap-2 flex flex-col">
<Paragraph class="flex gap-4 mb-4">
<div class="card-body p-4 gap-3 flex flex-col">
<Paragraph class="flex gap-4 max-w-sm mt-[0!important]">
<div class="badge variant-glass-warning w-8 h-8">
<ContainerIcon class="w-4 h-4 flex-shrink-0" />
<NodeJSIcon class="w-5 h-5 flex-shrink-0" />
</div>
{@html $t('home:manual:install:steps')}
</Paragraph>
<Paragraph class="flex gap-4 max-w-sm">
<div class="badge variant-glass-warning w-8 h-8">
<DBIcon class="w-4 h-4 flex-shrink-0" />
</div>
{@html $t('home:manual:install:redis')}
</Paragraph>
<Paragraph class="flex gap-4">
<div class="badge variant-glass-warning w-8 h-8">
<CloneIcon strokeWidth="2.25" class="w-4 h-4 flex-shrink-0" />
</div>
<span>
{@html $t('home:manual:install:clone:0')}
{@html $t('home:manual:install:clone:1')}
</span>
</Paragraph>
<Paragraph class="flex gap-4">
<div class="badge variant-glass-warning w-8 h-8">
<DownloadIcon class="w-4 h-4 flex-shrink-0" />
</div>
<span>
{@html $t('home:manual:install:download:0')}<br />
{@html $t('home:manual:install:download:1')}
</span>
</Paragraph>
<Paragraph class="flex gap-4">
<div class="badge variant-glass-warning w-8 h-8">
<KeyIcon class="w-4 h-4 flex-shrink-0" />
</div>
<span>
{@html $t('home:manual:install:env:0')}
{@html $t('home:manual:install:env:1')}
</span>
</Paragraph>
<Paragraph class="flex gap-4">
<div class="badge variant-glass-warning w-8 h-8">
<DevIcon class="w-4 h-4 flex-shrink-0" />
</div>
<div class="flex flex-col gap-2 w-full">
{$t('home:docker:description')}
<CodeBlock
buttonLabel={$t('global:misc:copy')}
language="shell"
code={$t('home:docker:run')}
></CodeBlock>
<span>
{@html $t('home:manual:install:dev:0')}<br />
{@html $t('home:manual:install:dev:1')}
</span>
</Paragraph>
<Paragraph class="flex gap-4">
<div class="badge variant-glass-warning w-8 h-8">
<BuildIcon class="w-4 h-4 flex-shrink-0" />
</div>
<span>
{@html $t('home:manual:install:build:0')}<br />
{@html $t('home:manual:install:build:1')}
</span>
</Paragraph>
<Paragraph class="flex gap-4 mb-4">
<div class="badge variant-glass-warning w-8 h-8">
<CorsIcon class="w-4 h-4 flex-shrink-0" />
</div>
<div class="flex flex-col gap-2 w-full">
<span class="max-w-sm">
{@html $t('home:docker:run:cors')}
</span>
<CodeBlock
buttonLabel={$t('global:misc:copy')}
language="shell"
code={$t('home:docker:run:origin')}
></CodeBlock>
<RunIcon class="w-4 h-4 flex-shrink-0" />
</div>
<span>
{@html $t('home:manual:install:run:0')}<br />
{@html $t('home:manual:install:run:1')}
</span>
</Paragraph>
</div>
</div>
<div class="card h-full">
<div class="card">
<div class="card-header">
<Lead>{$t('home:migration')}</Lead>
</div>
<div class="card-body p-4 gap-2 flex flex-col">
<Paragraph>
<Paragraph class="leading-7">
{$t('home:migration:description')}
</Paragraph>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<Lead>{@html $t('home:docker')}</Lead>
</div>
<div class="card-body p-4 gap-2 flex flex-col">
<Paragraph class="flex flex-col gap-4 mb-4">
<div class="flex gap-2 w-full">
<div class="badge variant-glass-warning w-8 h-8">
<ContainerIcon class="w-4 h-4 flex-shrink-0" />
</div>
{$t('home:docker:description')}
</div>
<CodeBlock
buttonLabel={$t('global:misc:copy')}
language="shell"
code={`version: "3"
services:
redis:
image: redis/redis-stack:latest
volumes:
- /etc/localtime:/etc/localtime:ro
- /home/snapp/redis/data:rw
networks:
- snapp-stack
environment:
REDIS_ARGS: "--save 60 1 --appendonly yes"
snapp:
image: uraniadev/snapp:0.7.test
ports:
- 5173:3000
networks:
- snapp-stack
environment:
DB_HOST: redis
AUTH_SECRET: # openssl rand -base64 32
networks:
snapp-stack:
external: false
`}
></CodeBlock>
</Paragraph>
<Paragraph class="flex gap-1 mb-4">
{@html $t('home:docker:better', { url: 'https://github.com/urania-dev/snapp' })}
</Paragraph>
</div>
</div>
</div>
<div class="flex gap-4 w-full items-center my-4">
<hr class="w-full" />

View File

@@ -1,3 +1,94 @@
:root{
--color-surface-950: "30 42 52",
}
/* :root [data-theme="snappTheme"] {
--theme-font-family-base: `system-ui`;
--theme-font-family-heading: `system-ui`;
--theme-font-color-base: 0 0 0;
--theme-font-color-dark: 255 255 255;
--theme-rounded-base: 0px;
--theme-rounded-container: 0px;
--theme-border-base: 1px;
--on-primary: 0 0 0;
--on-secondary: 255 255 255;
--on-tertiary: 255 255 255;
--on-success: 0 0 0;
--on-warning: 0 0 0;
--on-error: 255 255 255;
--on-surface: 255 255 255;
--color-primary-50: 249 243 225;
--color-primary-100: 246 239 215;
--color-primary-200: 244 235 205;
--color-primary-300: 238 223 175;
--color-primary-400: 225 199 115;
--color-primary-500: 212 175 55;
--color-primary-600: 191 158 50;
--color-primary-700: 159 131 41;
--color-primary-800: 127 105 33;
--color-primary-900: 104 86 27;
--color-secondary-50: 238 231 236;
--color-secondary-100: 233 222 229;
--color-secondary-200: 227 214 223;
--color-secondary-300: 210 190 203;
--color-secondary-400: 177 141 164;
--color-secondary-500: 143 92 125;
--color-secondary-600: 129 83 113;
--color-secondary-700: 107 69 94;
--color-secondary-800: 86 55 75;
--color-secondary-900: 70 45 61;
--color-tertiary-50: 222 228 233;
--color-tertiary-100: 211 218 225;
--color-tertiary-200: 201 209 218;
--color-tertiary-300: 168 182 196;
--color-tertiary-400: 102 127 151;
--color-tertiary-500: 37 72 107;
--color-tertiary-600: 33 65 96;
--color-tertiary-700: 28 54 80;
--color-tertiary-800: 22 43 64;
--color-tertiary-900: 18 35 52;
--color-success-50: 242 247 220;
--color-success-100: 238 245 208;
--color-success-200: 233 242 197;
--color-success-300: 220 235 161;
--color-success-400: 194 219 91;
--color-success-500: 168 204 21;
--color-success-600: 151 184 19;
--color-success-700: 126 153 16;
--color-success-800: 101 122 13;
--color-success-900: 82 100 10;
--color-warning-50: 248 230 222;
--color-warning-100: 245 221 211;
--color-warning-200: 243 213 200;
--color-warning-300: 236 188 167;
--color-warning-400: 221 137 101;
--color-warning-500: 207 87 35;
--color-warning-600: 186 78 32;
--color-warning-700: 155 65 26;
--color-warning-800: 124 52 21;
--color-warning-900: 101 43 17;
--color-error-50: 249 221 234;
--color-error-100: 246 209 228;
--color-error-200: 244 198 221;
--color-error-300: 238 163 200;
--color-error-400: 225 94 159;
--color-error-500: 212 25 118;
--color-error-600: 191 23 106;
--color-error-700: 159 19 89;
--color-error-800: 127 15 71;
--color-error-900: 104 12 58;
--color-surface-50: 224 225 226;
--color-surface-100: 214 215 216;
--color-surface-200: 204 206 206;
--color-surface-300: 173 176 177;
--color-surface-400: 112 116 119;
--color-surface-500: 51 57 60;
--color-surface-600: 46 51 54;
--color-surface-700: 38 43 45;
--color-surface-800: 31 34 36;
--color-surface-900: 25 28 29;
} */

View File

@@ -342,7 +342,7 @@
"snapps:import": "Import Snapps",
"snapps:import:sqlite:button": "Upgrade Database",
"snapps:import:sqlite:modal:label": "Upgrade Database",
"snapps:import:sqlite:modal:helper":"A SQLITE file from a previous version has been detected. Do you want to try importing the previous Snapp? This operation may take a long time for large databases.",
"snapps:import:sqlite:modal:helper": "A SQLITE file from a previous version has been detected. Do you want to try importing the previous Snapp? This operation may take a long time for large databases.",
"snapps:import:helper": "Import CSV File from previous version of Snapp",
"snapps:import:label": "Upload a CSV File",
"snapps:import:label:assign": "Assign snapps to users",
@@ -424,10 +424,8 @@
"home:manual:install:run:0": "Run and enjoy!",
"home:manual:install:run:1": "<code class=\"code\">node -r dotenv/config build</code>",
"home:docker": "Using Docker Container",
"home:docker:description": "Simply type in your terminal",
"home:docker:run": "docker run -p 3000:3000 uraniadev/snapp:latest",
"home:docker:run:cors": "If you run into <code class=\"code\">CORS</code> errors, remember to set <code class=\"code\">PUBLIC_URL</code> and <code class=\"code\">ORIGIN</code> env variables",
"home:docker:run:origin": "docker run -p 3000:3000 \n -e ORIGIN=https://example.com \n -e PUBLIC_URL=https://example.com \n uraniadev/snapp:latest",
"home:docker:description": "Use this docker-compose.yml to run your Snapp",
"home:docker:better": "You can find a better docker compose on our <a class=\"link\" href=\"{{url}}\">Github Repository</a>.",
"home:migration": "Migration",
"home:migration:description": "Latest versions of Snapp included CSV Export in order to facilitate migration. Simply login and import your urls from dashboard, and continue from where you left.",

View File

@@ -343,8 +343,8 @@
"snapps:import": "Importa Snapps",
"snapps:import:sqlite:button": "Aggiorna Database",
"snapps:import:sqlite:modal:label":"Aggiorna Database",
"snapps:import:sqlite:modal:helper":"Un file SQLITE di una precedente versione è stato rilevato. Vuoi provare l'importazione dei precedenti Snapp? Questa operazione potrebbe richiedere molto tempo in caso di database corposi",
"snapps:import:sqlite:modal:label": "Aggiorna Database",
"snapps:import:sqlite:modal:helper": "Un file SQLITE di una precedente versione è stato rilevato. Vuoi provare l'importazione dei precedenti Snapp? Questa operazione potrebbe richiedere molto tempo in caso di database corposi",
"snapps:import:helper": "Importa il CSV di una versione precedente di Snapp",
"snapps:import:label": "Carica un CSV",
"snapps:import:label:assign": "Assegna snapps agli utenti",
@@ -425,10 +425,8 @@
"home:manual:install:run:0": "Esegui e goditi!",
"home:manual:install:run:1": "<code class=\"code\">node -r dotenv/config build</code>",
"home:docker": "Utilizzo del container Docker",
"home:docker:description": "Scrivi semplicemente nel tuo terminale",
"home:docker:run": "docker run -p 3000:3000 uraniadev/snapp:latest",
"home:docker:run:cors": "Se incontri errori di <code class=\"code\">CORS</code>, ricorda di impostare le variabili d'ambiente <code class=\"code\">PUBLIC_URL</code> e <code class=\"code\">ORIGIN</code>",
"home:docker:run:origin": "docker run -p 3000:3000 \n -e ORIGIN=https://example.com \n -e PUBLIC_URL=https://example.com \n uraniadev/snapp:latest",
"home:docker:description": "Usa questo docker-compose.yml per far partire il tuo Snapp",
"home:docker:better": "Puoi trovare un docker compose migliore sul nostro <a class=\"link\" href=\"{{url}}\">Github Repository</a>.",
"home:migration": "Migrazione",
"home:migration:description": "Le ultime versioni di Snapp includono l'esportazione CSV per facilitare la migrazione. Effettua semplicemente il login e importa i tuoi URL dal dashboard e continua da dove hai lasciato.",