diff --git a/apps/samourai-server/docker-compose.yml b/apps/samourai-server/docker-compose.yml new file mode 100644 index 0000000..cfb92fb --- /dev/null +++ b/apps/samourai-server/docker-compose.yml @@ -0,0 +1,137 @@ +version: "3.7" + +x-logging: + &default-logging + driver: journald + options: + tag: "umbrel-app {{.Name}}" + +services: + db: + image: mariadb:10.5.8@sha256:8040983db146f729749081c6b216a19d52e0973134e2e34c0b4fd87f48bc15b0 + init: true + logging: *default-logging + restart: on-failure + stop_grace_period: 5m + user: "1000:1000" + environment: + MYSQL_DATABASE: samourai-main + MYSQL_ROOT_PASSWORD: rootpassword + MYSQL_USER: samourai + MYSQL_PASSWORD: password + volumes: + - ${APP_DATA_DIR}/mysql/data:/var/lib/mysql + - ${APP_DATA_DIR}/mysql/db-scripts:/docker-entrypoint-initdb.d + - ${APP_DATA_DIR}/mysql/mysql-dojo.cnf:/etc/mysql/conf.d/mysql-dojo.cnf + - ${APP_DATA_DIR}/mysql/update-db.sh:/update-db.sh + networks: + default: + ipv4_address: $APP_SAMOURAI_SERVER_DB_IP + + node: + image: louneskmt/dojo-nodejs:1.8.0@sha256:6643de76267e3a2cfd4f6d593d560a8dd001a54a7e5f9cc8df77d4cab5f1e1bf + init: true + logging: *default-logging + restart: on-failure + command: "/home/node/app/wait-for-it.sh db:3306 --timeout=720 --strict -- /home/node/app/restart.sh" + user: "1000:1000" + environment: + # GLOBAL + COMMON_BTC_NETWORK: $BITCOIN_NETWORK + DOJO_NODEJS_VERSION_TAG: 1.8.0 + TOR_PROXY_IP: $TOR_PROXY_IP + TOR_PROXY_PORT: $TOR_PROXY_PORT + + # MYSQL + MYSQL_DATABASE: samourai-main + MYSQL_USER: samourai + MYSQL_PASSWORD: password + + # NODEJS + NODE_GAP_EXTERNAL: 100 + NODE_GAP_INTERNAL: 100 + NODE_ADDR_FILTER_THRESHOLD: 1000 + NODE_ADDR_DERIVATION_MIN_CHILD: 2 + NODE_ADDR_DERIVATION_MAX_CHILD: 2 + NODE_ADDR_DERIVATION_THRESHOLD: 10 + NODE_TXS_SCHED_MAX_ENTRIES: 10 + NODE_TXS_SCHED_MAX_DELTA_HEIGHT: 18 + NODE_JWT_ACCESS_EXPIRES: 900 + NODE_JWT_REFRESH_EXPIRES: 7200 + NODE_PREFIX_STATUS: status + NODE_PREFIX_SUPPORT: support + NODE_PREFIX_STATUS_PUSHTX: status + NODE_TRACKER_MEMPOOL_PERIOD: 10000 + NODE_TRACKER_UNCONF_TXS_PERIOD: 300000 + NODE_ACTIVE_INDEXER: local_indexer + NODE_FEE_TYPE: ECONOMICAL + + # SECURITY + NODE_API_KEY: $SAMOURAI_SERVER_NODE_API_KEY + NODE_ADMIN_KEY: $SAMOURAI_SERVER_NODE_ADMIN_KEY + NODE_JWT_SECRET: $SAMOURAI_SERVER_NODE_JWT_SECRET + + # BITCOIN + BITCOIND_IP: $BITCOIN_IP + BITCOIND_RPC_PORT: $BITCOIN_RPC_PORT + BITCOIND_RPC_USER: $BITCOIN_RPC_USER + BITCOIND_RPC_PASSWORD: $BITCOIN_RPC_PASS + BITCOIND_ZMQ_RAWTXS: $BITCOIN_ZMQ_RAWTX_PORT + BITCOIND_ZMQ_BLK_HASH: $BITCOIN_ZMQ_HASHBLOCK_PORT + + # EXPLORER + EXPLORER_INSTALL: "off" + + # INDEXER + INDEXER_IP: $ELECTRUM_IP + INDEXER_RPC_PORT: $ELECTRUM_PORT + INDEXER_BATCH_SUPPORT: inactive # 'active' for ElectrumX, 'inactive' otherwise + depends_on: + - db + networks: + default: + ipv4_address: $APP_SAMOURAI_SERVER_NODE_IP + + whirlpool: + image: louneskmt/dojo-whirlpool:1.2.1@sha256:8674bca0d901e8d65d49e5cf38c597c37bf1d99168114a58b63b242dd1b38d05 + init: true + logging: *default-logging + restart: on-failure + command: /restart.sh + user: "1000:1000" + environment: + COMMON_BTC_NETWORK: $BITCOIN_NETWORK + WHIRLPOOL_RESYNC: "on" + WHIRLPOOL_DEBUG: "off" + WHIRLPOOL_DEBUG_CLIENT: "off" + NGINX_IP: $APP_SAMOURAI_SERVER_IP + volumes: + - ${APP_DATA_DIR}/whirlpool:/home/whirlpool/.whirlpool-cli + networks: + default: + ipv4_address: $APP_SAMOURAI_SERVER_WHIRLPOOL_IP + + nginx: + image: nginx:1.19-alpine@sha256:c2ce58e024275728b00a554ac25628af25c54782865b3487b11c21cafb7fabda + init: true + logging: *default-logging + restart: on-failure + command: /bin/sh -c "envsubst < /var/www/connect/js/conf.template.js > /var/www/connect/js/conf.js && /wait-for node:8080 --timeout=720 -- nginx" + volumes: + - ${APP_DATA_DIR}/nginx/wait-for:/wait-for + - ${APP_DATA_DIR}/nginx/nginx.conf:/etc/nginx/nginx.conf + - ${APP_DATA_DIR}/nginx/${BITCOIN_NETWORK}.conf:/etc/nginx/sites-enabled/dojo.conf + - ${APP_DATA_DIR}/nginx/connect:/var/www/connect + environment: + COMMON_BTC_NETWORK: $BITCOIN_NETWORK + DOJO_HIDDEN_SERVICE: $APP_HIDDEN_SERVICE + WHIRLPOOL_HIDDEN_SERVICE: $SAMOURAI_SERVER_WHIRLPOOL_HIDDEN_SERVICE + NODE_PREFIX_SUPPORT: support + NODE_ADMIN_KEY: $SAMOURAI_SERVER_NODE_ADMIN_KEY + ports: + - "$APP_SAMOURAI_SERVER_PORT:80" + depends_on: + - node + networks: + default: + ipv4_address: $APP_SAMOURAI_SERVER_IP diff --git a/apps/samourai-server/mysql/data/.gitkeep b/apps/samourai-server/mysql/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/samourai-server/mysql/db-scripts/1_db.sql b/apps/samourai-server/mysql/db-scripts/1_db.sql new file mode 100755 index 0000000..36a00ee --- /dev/null +++ b/apps/samourai-server/mysql/db-scripts/1_db.sql @@ -0,0 +1,203 @@ +# Database tables + +# Copyright © 2019 – Katana Cryptographic Ltd. All Rights Reserved. + + +# Naming conventions +# 1. Table names are lowercase plural +# 2. Join table names are snake_case plural +# 3. Column names have a table prefix +# 4. Foreign key names match primary key of foreign table + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `addresses` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `addresses` ( + `addrID` int(10) unsigned NOT NULL AUTO_INCREMENT, + `addrAddress` varchar(74) DEFAULT NULL, + PRIMARY KEY (`addrID`), + UNIQUE KEY `addrAddress` (`addrAddress`) +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `banned_addresses` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `banned_addresses` ( + `bannedAddressId` int(11) NOT NULL AUTO_INCREMENT, + `addrAddress` varchar(35) NOT NULL, + PRIMARY KEY (`bannedAddressId`), + UNIQUE KEY `banned_addresses_addresses` (`addrAddress`) +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `blocks` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `blocks` ( + `blockID` int(10) unsigned NOT NULL AUTO_INCREMENT, + `blockHash` char(64) NOT NULL DEFAULT '', + `blockParent` int(10) unsigned DEFAULT NULL, + `blockHeight` int(10) unsigned NOT NULL DEFAULT '0', + `blockTime` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`blockID`), + UNIQUE KEY `blockHash` (`blockHash`), + KEY `blockParent` (`blockParent`), + KEY `blockHeight` (`blockHeight`), + CONSTRAINT `blocks_ibfk_1` FOREIGN KEY (`blockParent`) REFERENCES `blocks` (`blockID`) ON DELETE SET NULL ON UPDATE NO ACTION +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `hd` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `hd` ( + `hdID` int(10) unsigned NOT NULL AUTO_INCREMENT, + `hdXpub` char(112) DEFAULT NULL, + `hdCreated` int(10) unsigned NOT NULL DEFAULT '0', + `hdType` smallint(5) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`hdID`), + UNIQUE KEY `hdXpub` (`hdXpub`), + KEY `hdCreated` (`hdCreated`) +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `hd_addresses` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `hd_addresses` ( + `hdAddrID` int(10) unsigned NOT NULL AUTO_INCREMENT, + `hdID` int(10) unsigned NOT NULL DEFAULT '0', + `addrID` int(10) unsigned NOT NULL DEFAULT '0', + `hdAddrChain` smallint(5) unsigned NOT NULL DEFAULT '0', + `hdAddrIndex` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`hdAddrID`), + UNIQUE KEY `hdID_2` (`hdID`,`addrID`), + KEY `hdID` (`hdID`), + KEY `addrID` (`addrID`), + CONSTRAINT `hd_addresses_ibfk_1` FOREIGN KEY (`hdID`) REFERENCES `hd` (`hdID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `hd_addresses_ibfk_2` FOREIGN KEY (`addrID`) REFERENCES `addresses` (`addrID`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `inputs` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `inputs` ( + `inID` int(10) unsigned NOT NULL AUTO_INCREMENT, + `outID` int(10) unsigned NOT NULL DEFAULT '0', + `txnID` int(10) unsigned NOT NULL DEFAULT '0', + `inIndex` int(10) unsigned NOT NULL DEFAULT '0', + `inSequence` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`inID`), + UNIQUE KEY `txnID_2` (`txnID`,`inIndex`), + KEY `outID` (`outID`), + KEY `txnID` (`txnID`), + CONSTRAINT `inputs_ibfk_1` FOREIGN KEY (`txnID`) REFERENCES `transactions` (`txnID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `inputs_ibfk_2` FOREIGN KEY (`outID`) REFERENCES `outputs` (`outID`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `outputs` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `outputs` ( + `outID` int(10) unsigned NOT NULL AUTO_INCREMENT, + `txnID` int(10) unsigned NOT NULL DEFAULT '0', + `addrID` int(10) unsigned NOT NULL DEFAULT '0', + `outIndex` int(10) unsigned NOT NULL DEFAULT '0', + `outAmount` bigint(20) unsigned NOT NULL DEFAULT '0', + `outScript` varchar(20000) NOT NULL DEFAULT '', + PRIMARY KEY (`outID`), + UNIQUE KEY `txnID_2` (`txnID`,`addrID`,`outIndex`), + KEY `txnID` (`txnID`), + KEY `addrID` (`addrID`), + CONSTRAINT `outputs_ibfk_1` FOREIGN KEY (`txnID`) REFERENCES `transactions` (`txnID`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `outputs_ibfk_2` FOREIGN KEY (`addrID`) REFERENCES `addresses` (`addrID`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `transactions` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `transactions` ( + `txnID` int(10) unsigned NOT NULL AUTO_INCREMENT, + `txnTxid` char(64) DEFAULT NULL, + `txnCreated` int(10) unsigned NOT NULL DEFAULT '0', + `txnVersion` int(10) unsigned NOT NULL DEFAULT '0', + `txnLocktime` int(10) unsigned NOT NULL DEFAULT '0', + `blockID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`txnID`), + UNIQUE KEY `txnTxid` (`txnTxid`), + KEY `txnCreated` (`txnCreated`), + KEY `blockID` (`blockID`), + CONSTRAINT `transactions_ibfk_1` FOREIGN KEY (`blockID`) REFERENCES `blocks` (`blockID`) ON DELETE SET NULL ON UPDATE NO ACTION +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `scheduled_transactions` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE IF NOT EXISTS `scheduled_transactions` ( + `schID` int(10) unsigned NOT NULL AUTO_INCREMENT, + `schTxid` char(64) NOT NULL DEFAULT '', + `schCreated` int(10) unsigned NOT NULL DEFAULT '0', + `schRaw` varchar(50000) NOT NULL DEFAULT '', + `schParentID` int(10) unsigned DEFAULT NULL, + `schParentTxid` char(64) DEFAULT '', + `schDelay` int(10) unsigned NOT NULL DEFAULT '0', + `schTrigger` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`schID`), + UNIQUE KEY `schTxid` (`schTxid`), + KEY `schParentID` (`schParentID`), + CONSTRAINT `scheduled_transactions_ibfk_1` FOREIGN KEY (`schParentID`) REFERENCES `scheduled_transactions` (`schID`) ON DELETE SET NULL ON UPDATE NO ACTION +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/apps/samourai-server/mysql/mysql-dojo.cnf b/apps/samourai-server/mysql/mysql-dojo.cnf new file mode 100644 index 0000000..1b697f5 --- /dev/null +++ b/apps/samourai-server/mysql/mysql-dojo.cnf @@ -0,0 +1,2 @@ +[mysqld] +sql_mode="NO_ENGINE_SUBSTITUTION" \ No newline at end of file diff --git a/apps/samourai-server/mysql/update-db.sh b/apps/samourai-server/mysql/update-db.sh new file mode 100755 index 0000000..001d2d9 --- /dev/null +++ b/apps/samourai-server/mysql/update-db.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +for i in {30..0}; do + if echo "SELECT 1" | mysql -h"db" -u"root" -p"$MYSQL_ROOT_PASSWORD" &> /dev/null; then + break + fi + echo "MySQL init process in progress..." + sleep 1 +done + +if [ -f /docker-entrypoint-initdb.d/2_update.sql ]; then + mysql -h"db" -u"root" -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE" < /docker-entrypoint-initdb.d/2_update.sql + echo "Updated database with 2_update.sql" +fi diff --git a/apps/samourai-server/nginx/connect/css/normalize.css b/apps/samourai-server/nginx/connect/css/normalize.css new file mode 100644 index 0000000..192eb9c --- /dev/null +++ b/apps/samourai-server/nginx/connect/css/normalize.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/apps/samourai-server/nginx/connect/css/style.css b/apps/samourai-server/nginx/connect/css/style.css new file mode 100644 index 0000000..360868b --- /dev/null +++ b/apps/samourai-server/nginx/connect/css/style.css @@ -0,0 +1,123 @@ +body { + background-color: #1D1B1B; + font-family: system-ui,-apple-system,BlinkMacSystemFont,Roboto,Helvetica Neue,Segoe UI,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji; + color: #fff; +} + +*, h1, h2, h3, h4, h5, h6, p, span { + color: #fff; + font-size: 20px; + font-weight: normal; +} + +.success { + color: #63FB72; +} + +.text-muted { + opacity: 0.8; +} + +hr { + width: 100%; + height: 2px; + background: #2F2C2C; + border: none; +} + +.container { + padding: 40px; + max-width: 1440px; + margin: auto; +} + +.app-icon { + border-radius: 20px; +} + +.app { + display: flex; + margin: 20px 0 40px 0; +} + +.app > .app-icon { + flex-shrink: 0; + height: 140px; + width: 140px; + box-shadow: 0 0 40px 0 rgba(0,0,0,0.95); + margin-right: 24px; +} + +.app > .app-details > .app-status { + display: block; + font-size: 20px; + margin: 10px 0 0 0; +} + + + +.app > .app-details > .app-name { + font-size: 52px; + line-height: 52px; + font-weight: bold; + margin: 10px 0 0 0; +} + +.heading { + display: flex; +} + +.heading > .number { + flex-shrink: 0; + background: #C12525; + height: 66px; + width: 66px; + border-radius: 100%; + line-height: 66px; + text-align: center; + font-size: 36px; + font-weight: bold; + box-shadow: 0 0 20px 0 rgba(0,0,0,0.8); +} +.heading > .text { + font-size: 52px; + line-height: 52px; + font-weight: bold; + display: inline-block; + margin: 5px 0 0 20px; +} + +.steps { + margin: 40px 0 0 9px; +} + +.steps > .step { + margin-bottom: 20px; + font-size: 20px; + font-weight: normal; +} + +.qr { + position: relative; + width: 260px; + height: 260px; + margin: 20px 0; +} + +.qr > .icon { + position: absolute; + top: 50%; + left: 50%; + transform: translate3d(-50%, -50%, 0); + height: 66px; + width: 66px; + background: #ffffff; +} + +.qr > .icon > img { + display: block; + width: 60px; + height: 60px; + margin: 3px 0 0 3px; + border-radius: 15%; +} \ No newline at end of file diff --git a/apps/samourai-server/nginx/connect/img/icon.svg b/apps/samourai-server/nginx/connect/img/icon.svg new file mode 100644 index 0000000..2c93b5d --- /dev/null +++ b/apps/samourai-server/nginx/connect/img/icon.svg @@ -0,0 +1,19 @@ + diff --git a/apps/samourai-server/nginx/connect/index.html b/apps/samourai-server/nginx/connect/index.html new file mode 100644 index 0000000..8445240 --- /dev/null +++ b/apps/samourai-server/nginx/connect/index.html @@ -0,0 +1,92 @@ + + + + +
+ + +Follow the instructions below to pair Dojo and Whirlpool running on your Umbrel to your + Samourai Wallet. +
+Note: You'll need to open Whirlpool GUI and re-enter your password to continue mixing after restarting or updating your Umbrel.
+