fix: indexes and multiple instances
This commit is contained in:
parent
cd40ede713
commit
38942dab9a
5 changed files with 2129 additions and 32 deletions
|
|
@ -1,54 +1,70 @@
|
||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
app:
|
# Multiple app instances
|
||||||
|
app-1:
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
target: production-main
|
target: production-main
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
ports:
|
ports:
|
||||||
- "3002:3000"
|
- "3003:3000" # Expose to host for nginx
|
||||||
env_file:
|
env_file:
|
||||||
- website/.env
|
- website/.env
|
||||||
|
environment:
|
||||||
|
- INSTANCE_NAME=app-1
|
||||||
depends_on:
|
depends_on:
|
||||||
- websocket
|
- websocket
|
||||||
- redis
|
|
||||||
- postgres
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- shared_backend
|
||||||
|
|
||||||
|
app-2:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
target: production-main
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
ports:
|
||||||
|
- "3004:3000" # Different port for second instance
|
||||||
|
env_file:
|
||||||
|
- website/.env
|
||||||
|
environment:
|
||||||
|
- INSTANCE_NAME=app-2
|
||||||
|
depends_on:
|
||||||
|
- websocket
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- shared_backend
|
||||||
|
|
||||||
|
app-3:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
target: production-main
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
ports:
|
||||||
|
- "3005:3000" # Different port for third instance
|
||||||
|
env_file:
|
||||||
|
- website/.env
|
||||||
|
environment:
|
||||||
|
- INSTANCE_NAME=app-3
|
||||||
|
depends_on:
|
||||||
|
- websocket
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- shared_backend
|
||||||
|
|
||||||
|
# WebSocket service (single instance is usually sufficient)
|
||||||
websocket:
|
websocket:
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
target: production-websocket
|
target: production-websocket
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
ports:
|
ports:
|
||||||
- "8081:8080"
|
- "8082:8080"
|
||||||
env_file:
|
env_file:
|
||||||
- website/.env
|
- website/.env
|
||||||
depends_on:
|
|
||||||
- redis
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- shared_backend
|
||||||
|
|
||||||
redis:
|
networks:
|
||||||
image: redis:8-alpine
|
shared_backend:
|
||||||
volumes:
|
external: true
|
||||||
- rugplay_redisdata:/data
|
|
||||||
command: "redis-server --save 60 1"
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
postgres:
|
|
||||||
image: pgvector/pgvector:pg16
|
|
||||||
container_name: rugplay-postgres
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: ${POSTGRES_USER}
|
|
||||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
||||||
POSTGRES_DB: ${POSTGRES_DB:-rugplay}
|
|
||||||
ports:
|
|
||||||
- "5432:5432"
|
|
||||||
volumes:
|
|
||||||
- rugplay_pgdata:/var/lib/postgresql/data
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
rugplay_pgdata:
|
|
||||||
rugplay_redisdata:
|
|
||||||
19
website/drizzle/0003_complete_runaways.sql
Normal file
19
website/drizzle/0003_complete_runaways.sql
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
CREATE INDEX IF NOT EXISTS "coin_symbol_idx" ON "coin" USING btree ("symbol");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "coin_creator_id_idx" ON "coin" USING btree ("creator_id");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "coin_is_listed_idx" ON "coin" USING btree ("is_listed");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "coin_market_cap_idx" ON "coin" USING btree ("market_cap");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "coin_current_price_idx" ON "coin" USING btree ("current_price");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "coin_change24h_idx" ON "coin" USING btree ("change_24h");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "coin_volume24h_idx" ON "coin" USING btree ("volume_24h");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "coin_created_at_idx" ON "coin" USING btree ("created_at");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "transaction_user_id_idx" ON "transaction" USING btree ("user_id");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "transaction_coin_id_idx" ON "transaction" USING btree ("coin_id");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "transaction_type_idx" ON "transaction" USING btree ("type");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "transaction_timestamp_idx" ON "transaction" USING btree ("timestamp");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "transaction_user_coin_idx" ON "transaction" USING btree ("user_id","coin_id");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "transaction_coin_type_idx" ON "transaction" USING btree ("coin_id","type");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "user_username_idx" ON "user" USING btree ("username");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "user_is_banned_idx" ON "user" USING btree ("is_banned");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "user_is_admin_idx" ON "user" USING btree ("is_admin");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "user_created_at_idx" ON "user" USING btree ("created_at");--> statement-breakpoint
|
||||||
|
CREATE INDEX IF NOT EXISTS "user_updated_at_idx" ON "user" USING btree ("updated_at");
|
||||||
2027
website/drizzle/meta/0003_snapshot.json
Normal file
2027
website/drizzle/meta/0003_snapshot.json
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -22,6 +22,13 @@
|
||||||
"when": 1749916220202,
|
"when": 1749916220202,
|
||||||
"tag": "0002_small_micromacro",
|
"tag": "0002_small_micromacro",
|
||||||
"breakpoints": true
|
"breakpoints": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idx": 3,
|
||||||
|
"version": "7",
|
||||||
|
"when": 1750707307426,
|
||||||
|
"tag": "0003_complete_runaways",
|
||||||
|
"breakpoints": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -33,6 +33,14 @@ export const user = pgTable("user", {
|
||||||
}).notNull().default("0.00000000"),
|
}).notNull().default("0.00000000"),
|
||||||
loginStreak: integer("login_streak").notNull().default(0),
|
loginStreak: integer("login_streak").notNull().default(0),
|
||||||
prestigeLevel: integer("prestige_level").default(0),
|
prestigeLevel: integer("prestige_level").default(0),
|
||||||
|
}, (table) => {
|
||||||
|
return {
|
||||||
|
usernameIdx: index("user_username_idx").on(table.username),
|
||||||
|
isBannedIdx: index("user_is_banned_idx").on(table.isBanned),
|
||||||
|
isAdminIdx: index("user_is_admin_idx").on(table.isAdmin),
|
||||||
|
createdAtIdx: index("user_created_at_idx").on(table.createdAt),
|
||||||
|
updatedAtIdx: index("user_updated_at_idx").on(table.updatedAt),
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
export const session = pgTable("session", {
|
export const session = pgTable("session", {
|
||||||
|
|
@ -88,6 +96,17 @@ export const coin = pgTable("coin", {
|
||||||
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
||||||
isListed: boolean("is_listed").default(true).notNull(),
|
isListed: boolean("is_listed").default(true).notNull(),
|
||||||
|
}, (table) => {
|
||||||
|
return {
|
||||||
|
symbolIdx: index("coin_symbol_idx").on(table.symbol),
|
||||||
|
creatorIdIdx: index("coin_creator_id_idx").on(table.creatorId),
|
||||||
|
isListedIdx: index("coin_is_listed_idx").on(table.isListed),
|
||||||
|
marketCapIdx: index("coin_market_cap_idx").on(table.marketCap),
|
||||||
|
currentPriceIdx: index("coin_current_price_idx").on(table.currentPrice),
|
||||||
|
change24hIdx: index("coin_change24h_idx").on(table.change24h),
|
||||||
|
volume24hIdx: index("coin_volume24h_idx").on(table.volume24h),
|
||||||
|
createdAtIdx: index("coin_created_at_idx").on(table.createdAt),
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
export const userPortfolio = pgTable("user_portfolio", {
|
export const userPortfolio = pgTable("user_portfolio", {
|
||||||
|
|
@ -114,6 +133,15 @@ export const transaction = pgTable("transaction", {
|
||||||
timestamp: timestamp("timestamp", { withTimezone: true }).notNull().defaultNow(),
|
timestamp: timestamp("timestamp", { withTimezone: true }).notNull().defaultNow(),
|
||||||
recipientUserId: integer('recipient_user_id').references(() => user.id, { onDelete: 'set null' }),
|
recipientUserId: integer('recipient_user_id').references(() => user.id, { onDelete: 'set null' }),
|
||||||
senderUserId: integer('sender_user_id').references(() => user.id, { onDelete: 'set null' }),
|
senderUserId: integer('sender_user_id').references(() => user.id, { onDelete: 'set null' }),
|
||||||
|
}, (table) => {
|
||||||
|
return {
|
||||||
|
userIdIdx: index("transaction_user_id_idx").on(table.userId),
|
||||||
|
coinIdIdx: index("transaction_coin_id_idx").on(table.coinId),
|
||||||
|
typeIdx: index("transaction_type_idx").on(table.type),
|
||||||
|
timestampIdx: index("transaction_timestamp_idx").on(table.timestamp),
|
||||||
|
userCoinIdx: index("transaction_user_coin_idx").on(table.userId, table.coinId),
|
||||||
|
coinTypeIdx: index("transaction_coin_type_idx").on(table.coinId, table.type),
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
export const priceHistory = pgTable("price_history", {
|
export const priceHistory = pgTable("price_history", {
|
||||||
|
|
|
||||||
Reference in a new issue