feat: project setup
This commit is contained in:
226
server/.gitignore
vendored
Normal file
226
server/.gitignore
vendored
Normal file
@@ -0,0 +1,226 @@
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log files
|
||||
*.log
|
||||
logs/
|
||||
*.log.*
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# Virtual machine crash logs
|
||||
hs_err_pid*
|
||||
replay_pid*
|
||||
|
||||
# Gradle
|
||||
.gradle/
|
||||
build/
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
# Gradle Wrapper
|
||||
!gradle/wrapper/gradle-wrapper.properties
|
||||
|
||||
# IntelliJ IDEA
|
||||
.idea/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
out/
|
||||
!**/src/main/**/out/
|
||||
!**/src/test/**/out/
|
||||
|
||||
# Eclipse
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
bin/
|
||||
!**/src/main/**/bin/
|
||||
!**/src/test/**/bin/
|
||||
|
||||
# NetBeans
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
|
||||
# VS Code
|
||||
.vscode/
|
||||
|
||||
# Mac
|
||||
.DS_Store
|
||||
|
||||
# Windows
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
Desktop.ini
|
||||
|
||||
# Linux
|
||||
*~
|
||||
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.temp
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# Database
|
||||
*.db
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
|
||||
# Environment variables
|
||||
.env
|
||||
.env.local
|
||||
.env.development
|
||||
.env.test
|
||||
.env.production
|
||||
|
||||
# Docker
|
||||
.dockerignore
|
||||
docker-compose.override.yml
|
||||
|
||||
# Application specific
|
||||
application-local.conf
|
||||
application-dev.conf
|
||||
application-prod.conf
|
||||
|
||||
# Secrets
|
||||
secrets/
|
||||
*.key
|
||||
*.pem
|
||||
*.p12
|
||||
*.jks
|
||||
|
||||
# Test results
|
||||
test-results/
|
||||
coverage/
|
||||
*.coverage
|
||||
|
||||
# Node modules (if any frontend tools)
|
||||
node_modules/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Python (if any scripts)
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
*.so
|
||||
.Python
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
|
||||
# Backup files
|
||||
*.bak
|
||||
*.backup
|
||||
*.old
|
||||
|
||||
# Cache directories
|
||||
.cache/
|
||||
.tmp/
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage/
|
||||
*.lcov
|
||||
|
||||
# Dependency directories
|
||||
jspm_packages/
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Storybook build outputs
|
||||
.out
|
||||
.storybook-out
|
||||
|
||||
# Temporary folders
|
||||
tmp/
|
||||
temp/
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
# OS generated files
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
ehthumbs.db
|
||||
Thumbs.db
|
||||
|
||||
# CCoin specific
|
||||
wallet_data/
|
||||
blockchain_data/
|
||||
mining_cache/
|
||||
transaction_pool/
|
||||
|
||||
# ComputerCraft
|
||||
cc/data/
|
||||
cc/logs/
|
||||
cc/*.log
|
||||
|
||||
67
server/Dockerfile
Normal file
67
server/Dockerfile
Normal file
@@ -0,0 +1,67 @@
|
||||
# Multi-stage build for Java 24
|
||||
FROM openjdk:24-jdk-slim AS builder
|
||||
|
||||
# Install required packages
|
||||
RUN apt-get update && apt-get install -y \
|
||||
curl \
|
||||
unzip \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Copy gradle wrapper and build files
|
||||
COPY gradle/ gradle/
|
||||
COPY gradlew .
|
||||
COPY gradle.properties .
|
||||
COPY settings.gradle.kts .
|
||||
COPY build.gradle.kts .
|
||||
|
||||
# Make gradlew executable
|
||||
RUN chmod +x gradlew
|
||||
|
||||
# Download dependencies (for better caching)
|
||||
RUN ./gradlew dependencies --no-daemon
|
||||
|
||||
# Copy source code
|
||||
COPY src/ src/
|
||||
|
||||
# Build the application
|
||||
RUN ./gradlew shadowJar --no-daemon
|
||||
|
||||
# Runtime stage
|
||||
FROM openjdk:24-jdk-slim
|
||||
|
||||
# Install required runtime packages
|
||||
RUN apt-get update && apt-get install -y \
|
||||
curl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Create app user
|
||||
RUN groupadd -r ccoin && useradd -r -g ccoin ccoin
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Copy the built JAR from builder stage
|
||||
COPY --from=builder /app/build/libs/*.jar app.jar
|
||||
|
||||
# Change ownership to app user
|
||||
RUN chown -R ccoin:ccoin /app
|
||||
|
||||
# Switch to app user
|
||||
USER ccoin
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8080
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
||||
CMD curl -f http://localhost:8080/health || exit 1
|
||||
|
||||
# JVM options for production
|
||||
ENV JAVA_OPTS="-Xmx512m -Xms256m -XX:+UseG1GC -XX:+UseStringDeduplication"
|
||||
|
||||
# Run the application
|
||||
CMD ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
|
||||
|
||||
0
server/README.md
Normal file
0
server/README.md
Normal file
121
server/build.gradle.kts
Normal file
121
server/build.gradle.kts
Normal file
@@ -0,0 +1,121 @@
|
||||
val ktor_version: String by project
|
||||
val kotlin_version: String by project
|
||||
val logback_version: String by project
|
||||
val exposed_version: String by project
|
||||
val postgresql_version: String by project
|
||||
val hikari_version: String by project
|
||||
val flyway_version: String by project
|
||||
val bouncycastle_version: String by project
|
||||
|
||||
plugins {
|
||||
kotlin("jvm") version "2.2.21"
|
||||
kotlin("plugin.serialization") version "2.2.21"
|
||||
id("io.ktor.plugin") version "3.3.3"
|
||||
id("com.gradleup.shadow") version "9.3.0"
|
||||
id("org.flywaydb.flyway") version "11.19.0"
|
||||
application
|
||||
}
|
||||
|
||||
group = "org.ccoin"
|
||||
version = "1.0.0"
|
||||
|
||||
application {
|
||||
mainClass.set("org.ccoin.ServerKt")
|
||||
|
||||
val isDevelopment: Boolean = project.ext.has("development")
|
||||
applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment")
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Ktor server
|
||||
implementation("io.ktor:ktor-server-core-jvm:$ktor_version")
|
||||
implementation("io.ktor:ktor-server-netty-jvm:$ktor_version")
|
||||
implementation("io.ktor:ktor-server-content-negotiation-jvm:$ktor_version")
|
||||
implementation("io.ktor:ktor-serialization-kotlinx-json-jvm:$ktor_version")
|
||||
implementation("io.ktor:ktor-server-cors-jvm:$ktor_version")
|
||||
implementation("io.ktor:ktor-server-call-logging-jvm:$ktor_version")
|
||||
implementation("io.ktor:ktor-server-status-pages-jvm:$ktor_version")
|
||||
implementation("io.ktor:ktor-server-compression-jvm:$ktor_version")
|
||||
implementation("io.ktor:ktor-server-default-headers-jvm:$ktor_version")
|
||||
implementation("io.ktor:ktor-server-host-common-jvm:$ktor_version")
|
||||
implementation("io.ktor:ktor-server-config-yaml:$ktor_version")
|
||||
|
||||
// Database
|
||||
implementation("org.jetbrains.exposed:exposed-core:$exposed_version")
|
||||
implementation("org.jetbrains.exposed:exposed-dao:$exposed_version")
|
||||
implementation("org.jetbrains.exposed:exposed-jdbc:$exposed_version")
|
||||
implementation("org.jetbrains.exposed:exposed-java-time:$exposed_version")
|
||||
implementation("org.postgresql:postgresql:$postgresql_version")
|
||||
implementation("com.zaxxer:HikariCP:$hikari_version")
|
||||
implementation("org.flywaydb:flyway-core:$flyway_version")
|
||||
implementation("org.flywaydb:flyway-database-postgresql:$flyway_version")
|
||||
|
||||
// Logging
|
||||
implementation("ch.qos.logback:logback-classic:$logback_version")
|
||||
implementation("io.github.oshai:kotlin-logging-jvm:7.0.0")
|
||||
|
||||
// Crypto utilities
|
||||
implementation("org.bouncycastle:bcprov-jdk18on:$bouncycastle_version")
|
||||
implementation("org.bouncycastle:bcpkix-jdk18on:$bouncycastle_version")
|
||||
|
||||
// JSON
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1")
|
||||
|
||||
// Coroutines
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
|
||||
|
||||
// Testing
|
||||
testImplementation("io.ktor:ktor-server-test-host-jvm:$ktor_version")
|
||||
testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")
|
||||
testImplementation("io.mockk:mockk:1.13.13")
|
||||
testImplementation("org.junit.jupiter:junit-jupiter:5.11.3")
|
||||
testImplementation("org.testcontainers:testcontainers:1.20.3")
|
||||
testImplementation("org.testcontainers:postgresql:1.20.3")
|
||||
testImplementation("org.testcontainers:junit-jupiter:1.20.3")
|
||||
}
|
||||
|
||||
tasks.withType<Test> {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
|
||||
// Fat JAR configuration for Docker
|
||||
tasks.jar {
|
||||
enabled = false
|
||||
}
|
||||
|
||||
tasks.shadowJar {
|
||||
archiveClassifier.set("")
|
||||
manifest {
|
||||
attributes["Main-Class"] = "org.ccoin.ServerKt"
|
||||
}
|
||||
// mergeServiceFile()
|
||||
}
|
||||
|
||||
// Flyway configuration
|
||||
flyway {
|
||||
url = "jbdc:postgresql://localhost:5432/ccoin"
|
||||
user = "ccoin"
|
||||
password = "ccoin"
|
||||
locations = arrayOf("classpath:db/migration")
|
||||
baselineOnMigrate = true
|
||||
validateOnMigrate = true
|
||||
}
|
||||
|
||||
// Docker build task
|
||||
tasks.register<Exec>("buildDocker") {
|
||||
dependsOn("shadowJar")
|
||||
commandLine("docker", "build", "-t", "ccoin-server:latest", ".")
|
||||
}
|
||||
|
||||
// Development task
|
||||
tasks.register("dev") {
|
||||
dependsOn("run")
|
||||
doFirst {
|
||||
project.ext.set("development", true)
|
||||
}
|
||||
}
|
||||
82
server/docker-compose.yml
Normal file
82
server/docker-compose.yml
Normal file
@@ -0,0 +1,82 @@
|
||||
services:
|
||||
# Postgres Database
|
||||
postgres:
|
||||
image: postgres:17-alpine
|
||||
container_name: ccoin-postgres
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_DB: ccoin
|
||||
POSTGRES_USER: ccoin
|
||||
POSTGRES_PASSWORD: ccoin
|
||||
POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --lc-collate=C --lc-ctype=C"
|
||||
ports:
|
||||
- "5432:5432"
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
- ./docker/postgres/init:/docker-entrypoint-initdb.d
|
||||
networks:
|
||||
- ccoin-network
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ccoin -d ccoin"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 30s
|
||||
|
||||
# CCoin server
|
||||
ccoin-server:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
container_name: ccoin-server
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8080:8080"
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
# Database configuration
|
||||
DATABASE_URL: jdbc:postgresql://postgres:5432/ccoin
|
||||
DATABASE_USER: ccoin
|
||||
DATABASE_PASSWORD: ccoin
|
||||
DATABASE_POOL_SIZE: 20
|
||||
|
||||
# Server configuration
|
||||
SERVER_HOST: 0.0.0.0
|
||||
SERVER_PORT: 8080
|
||||
|
||||
# Mining configuration
|
||||
MINING_DIFFICULTY: 4
|
||||
MINING_REWARD: 50.0
|
||||
BLOCK_TIME_TARGET: 600000
|
||||
|
||||
# Security
|
||||
JWT_SECRET: your-super-secret-jwt-key-change-this-in-production
|
||||
|
||||
# Logging
|
||||
LOG_LEVEL: INFO
|
||||
|
||||
# Development
|
||||
DEVELOPMENT_MODE: false
|
||||
volumes:
|
||||
- ./logs:/app/logs
|
||||
networks:
|
||||
- ccoin-network
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
driver: local
|
||||
|
||||
networks:
|
||||
ccoin-network:
|
||||
driver: bridge
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 172.20.0.0/16
|
||||
24
server/gradle.properties
Normal file
24
server/gradle.properties
Normal file
@@ -0,0 +1,24 @@
|
||||
# Ktor
|
||||
ktor_version=3.3.3
|
||||
kotlin_version=2.2.21
|
||||
|
||||
# Database
|
||||
exposed_version=0.56.0
|
||||
postgresql_version=42.7.4
|
||||
hikari_version=6.0.0
|
||||
flyway_version=11.19.0
|
||||
|
||||
# Crypto
|
||||
bouncycastle_version=1.78.1
|
||||
|
||||
# Logging
|
||||
logback_version=1.5.12
|
||||
|
||||
# Gradle
|
||||
kotlin.code.style=official
|
||||
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
|
||||
org.gradle.caching=true
|
||||
org.gradle.parallel=true
|
||||
|
||||
# Application
|
||||
ccoin.version=1.0.0
|
||||
0
server/settings.gradle.kts
Normal file
0
server/settings.gradle.kts
Normal file
5
server/src/main/kotlin/org/ccoin/Server.kt
Normal file
5
server/src/main/kotlin/org/ccoin/Server.kt
Normal file
@@ -0,0 +1,5 @@
|
||||
package org.ccoin
|
||||
|
||||
fun main() {
|
||||
println("CCoin Server Started")
|
||||
}
|
||||
0
server/src/main/kotlin/org/ccoin/database/Tables.kt
Normal file
0
server/src/main/kotlin/org/ccoin/database/Tables.kt
Normal file
0
server/src/main/kotlin/org/ccoin/models/Block.kt
Normal file
0
server/src/main/kotlin/org/ccoin/models/Block.kt
Normal file
0
server/src/main/kotlin/org/ccoin/models/Wallet.kt
Normal file
0
server/src/main/kotlin/org/ccoin/models/Wallet.kt
Normal file
0
server/src/main/kotlin/org/ccoin/utils/HashUtils.kt
Normal file
0
server/src/main/kotlin/org/ccoin/utils/HashUtils.kt
Normal file
0
server/src/main/resources/application.conf
Normal file
0
server/src/main/resources/application.conf
Normal file
0
server/src/main/resources/logback.xml
Normal file
0
server/src/main/resources/logback.xml
Normal file
0
server/src/test/kotlin/org/ccoin/ServerTest.kt
Normal file
0
server/src/test/kotlin/org/ccoin/ServerTest.kt
Normal file
Reference in New Issue
Block a user