Skip to content

Commit 6297481

Browse files
committed
[common] fix: build & [web] feat: docker
1 parent a2b9d2e commit 6297481

11 files changed

Lines changed: 211 additions & 76 deletions

File tree

.dockerignore

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+
3+
# Dependencies
4+
node_modules
5+
.pnp
6+
.pnp.js
7+
8+
# Local env files
9+
.env
10+
.env.local
11+
.env.development.local
12+
.env.test.local
13+
.env.production.local
14+
15+
# Testing
16+
coverage
17+
18+
# Turbo
19+
.turbo
20+
21+
# Vercel
22+
.vercel
23+
24+
# Build Outputs
25+
.next/
26+
out/
27+
build
28+
dist
29+
30+
# Debug
31+
npm-debug.log*
32+
yarn-debug.log*
33+
yarn-error.log*
34+
35+
# Misc
36+
.DS_Store
37+
*.pem
38+
39+
# IDEs
40+
.vscode/*
41+
!.vscode/extensions.json
42+
!.vscode/settings.json
43+
.idea/*
44+
!.idea/icon.*
45+
*.suo
46+
*.ntvs*
47+
*.njsproj
48+
*.sln
49+
*.sw?
50+
*.iml
51+
*.ipr
52+
*.iws
53+
54+
# Cargo
55+
/target

.github/workflows/build-web.yml

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,13 @@ jobs:
2626
fail-fast: false
2727
matrix:
2828
include:
29-
# 谁jb爱修修吧
30-
# - platform: ubuntu-latest
31-
# target: x86_64-unknown-linux-gnu
32-
# targetName: linux-x86_64-gnu
33-
#
34-
# - platform: ubuntu-latest
35-
# target: x86_64-unknown-linux-musl
36-
# targetName: linux-x86_64-musl
29+
- platform: ubuntu-latest
30+
target: x86_64-unknown-linux-gnu
31+
targetName: linux-x86_64-gnu
32+
33+
- platform: ubuntu-latest
34+
target: x86_64-unknown-linux-musl
35+
targetName: linux-x86_64-musl
3736

3837
- platform: macos-latest
3938
target: x86_64-apple-darwin
@@ -92,6 +91,13 @@ jobs:
9291
- name: Install NPM dependencies
9392
run: pnpm install --frozen-lockfile
9493

94+
- name: Install dependencies (ubuntu only)
95+
if: matrix.platform == 'ubuntu-latest'
96+
run: |
97+
sudo apt-get update
98+
sudo apt-get install -y pkgconfig openssl-dev
99+
100+
95101
- name: Install Rust
96102
uses: dtolnay/rust-toolchain@stable
97103
with:

apps/app/src/env.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/// <reference types="@rsbuild/core/types" />
2+
3+
declare module "*.vue" {
4+
import type { DefineComponent } from "vue";
5+
const component: DefineComponent<object, object, any>;
6+
export default component;
7+
}

apps/app/tsconfig.node.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
{
22
"extends": "@repo/configs/ts/base.json",
3-
"include": ["vite.config.ts"]
3+
"include": ["vite.config.ts"],
4+
"compilerOptions": {
5+
"composite": true
6+
}
47
}

apps/web/Dockerfile

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# 构建阶段 - 前端构建
2+
FROM node:18-alpine AS frontend-builder
3+
4+
RUN npm install -g pnpm
5+
6+
WORKDIR /app
7+
8+
COPY . .
9+
10+
RUN pnpm install --frozen-lockfile
11+
12+
WORKDIR apps/web
13+
14+
RUN pnpm frontend:build
15+
16+
# 构建阶段 - Rust后端构建
17+
FROM rust:alpine AS backend-builder
18+
19+
# 使用apk安装构建依赖
20+
RUN apk add --no-cache \
21+
pkgconfig \
22+
openssl-dev \
23+
musl-dev
24+
25+
WORKDIR /app
26+
27+
COPY --from=frontend-builder /app /app
28+
29+
WORKDIR apps/web
30+
31+
RUN cargo build --release --package mcsl_future_web
32+
33+
# 运行时阶段
34+
FROM alpine:3.18
35+
36+
RUN apk add --no-cache \
37+
ca-certificates \
38+
curl
39+
40+
RUN addgroup -S appuser && adduser -S appuser -G appuser
41+
42+
WORKDIR /app
43+
44+
COPY --from=backend-builder /app/target/release/mcsl_future_web /app/mcsl_future_web
45+
46+
RUN chown -R appuser:appuser /app
47+
48+
USER appuser
49+
50+
EXPOSE 11451
51+
52+
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
53+
CMD curl -f http://localhost:11451/api/ || exit 1
54+
55+
CMD ["/app/mcsl_future_web"]

apps/web/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"type": "module",
66
"scripts": {
77
"build": "pnpm frontend:build && cargo build --release",
8+
"build:docker": "cd ../../; docker build -f apps/web/Dockerfile --progress=plain -t mcsl-future-web .; cd -",
89
"backend:dev": "cargo run",
910
"frontend:dev": "rsbuild dev",
1011
"frontend:build": "vue-tsc --noEmit && rsbuild build",

apps/web/src-frontend/env.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// <reference types="@rsbuild/core/types" />
2+
/// <reference types="rsbuild-plugin-svg" />
3+
4+
declare module "*.vue" {
5+
import type { DefineComponent } from "vue";
6+
const component: DefineComponent<object, object, any>;
7+
export default component;
8+
}

apps/web/src/main.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use actix_web::{App, HttpResponse, HttpServer, get, middleware::Logger, web};
1+
use actix_web::{get, middleware::Logger, web, App, HttpResponse, HttpServer};
2+
#[cfg(not(debug_assertions))]
3+
use include_dir::{include_dir, Dir};
24
use log::info;
35

46
pub mod user;
@@ -30,7 +32,7 @@ async fn main() -> std::io::Result<()> {
3032

3133
app
3234
})
33-
.bind("0.0.0.0:11452")?
35+
.bind("0.0.0.0:11451")?
3436
.run()
3537
.await
3638
}

apps/web/src/user.rs

Lines changed: 55 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,55 @@
1-
use std::fs;
2-
use std::path::Path;
3-
4-
use std::error::Error;
5-
6-
#[derive(Debug, serde::Deserialize, serde::Serialize, Clone)]
7-
pub enum Permission {
8-
9-
} // biewanglejia
10-
11-
#[derive(Debug, serde::Deserialize, serde::Serialize, Clone)]
12-
pub struct User {
13-
pub id: u32,
14-
pub username: String,
15-
pub password: String,
16-
pub permission: Permission,
17-
}
18-
19-
impl User {
20-
fn get_users() -> Result<Vec<User>, &str> {
21-
let path = Path::new("users.json");
22-
23-
if !path.exists() {
24-
fs::write(path, "[]")?;
25-
return Ok(Vec::new()); // 这里涵盖没有就创建
26-
}
27-
let data = fs::read_to_string(path)?;
28-
29-
let users: Vec<User> = serde_json::from_str(&data)?;
30-
31-
Ok(users)
32-
}
33-
fn remove(id: u32) -> Result<(), &str>{
34-
let mut users = User::get_users()?;
35-
let initial_len = users.len();
36-
users.retain(|u| u.id != id);
37-
if users.len() < initial_len {Ok(())}
38-
Err("Unknown user.")
39-
40-
}
41-
fn new(username: String, password: String, permission: Permission) -> Result<(), &str> {
42-
let mut users = User::get_users()?;
43-
if users.iter().any(|u| u.username == username) {
44-
return Err("Duplicate username.");
45-
} // 查重
46-
47-
let new_user = User {
48-
id: users.len() as u32 + 1,
49-
username,
50-
password,
51-
permission,
52-
};
53-
54-
users.push(new_user);
55-
let serialized_data = serde_json::to_string_pretty(&users)?;
56-
fs::write("users.json", serialized_data)?;
57-
58-
Ok(())
59-
}
60-
}
1+
// use std::fs;
2+
// use std::path::Path;
3+
//
4+
// use std::error::Error;
5+
//
6+
// #[derive(Debug, serde::Deserialize, serde::Serialize, Clone)]
7+
// pub struct User {
8+
// pub id: u32,
9+
// pub username: String,
10+
// pub password: String,
11+
// pub permission: Vec<String>,
12+
// }
13+
//
14+
// impl User {
15+
// fn get_users() -> Result<Vec<User>, &str> {
16+
// let path = Path::new("users.json");
17+
//
18+
// if !path.exists() {
19+
// fs::write(path, "[]")?;
20+
// return Ok(Vec::new()); // 这里涵盖没有就创建
21+
// }
22+
// let data = fs::read_to_string(path)?;
23+
//
24+
// let users: Vec<User> = serde_json::from_str(&data)?;
25+
//
26+
// Ok(users)
27+
// }
28+
// fn remove(id: u32) -> Result<(), &str>{
29+
// let mut users = User::get_users()?;
30+
// let initial_len = users.len();
31+
// users.retain(|u| u.id != id);
32+
// if users.len() < initial_len {Ok(())}
33+
// Err("Unknown user.")
34+
//
35+
// }
36+
// fn new(username: String, password: String, permission: Permission) -> Result<(), &str> {
37+
// let mut users = User::get_users()?;
38+
// if users.iter().any(|u| u.username == username) {
39+
// return Err("Duplicate username.");
40+
// } // 查重
41+
//
42+
// let new_user = User {
43+
// id: users.len() as u32 + 1,
44+
// username,
45+
// password,
46+
// permission,
47+
// };
48+
//
49+
// users.push(new_user);
50+
// let serialized_data = serde_json::to_string_pretty(&users)?;
51+
// fs::write("users.json", serialized_data)?;
52+
//
53+
// Ok(())
54+
// }
55+
// }

apps/web/tsconfig.node.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
{
22
"extends": "@repo/configs/ts/base.json",
3-
"include": ["vite.config.ts"]
3+
"include": ["vite.config.ts"],
4+
"compilerOptions": {
5+
"composite": true
6+
}
47
}

0 commit comments

Comments
 (0)