From c1615a1bcb40a32e8cb241a2c9cb21220db8e75f Mon Sep 17 00:00:00 2001 From: mace Date: Thu, 28 Mar 2024 14:52:06 +0100 Subject: [PATCH] added environment for vue, split dockerfiles, add rust dependencies. --- .dockerignore | 7 + Cargo.lock | 223 ++++++++++++++++++++++++++++++- Cargo.toml | 6 + Dockerfile | 41 ++++++ docker-compose.yml | 28 ++++ vue/.env.development | 2 + vue/.env.production | 2 + vue/Dockerfile | 22 +++ vue/package-lock.json | 13 ++ vue/package.json | 1 + vue/src/components/LoginPage.vue | 2 +- vue/vite.config.js | 18 ++- 12 files changed, 352 insertions(+), 13 deletions(-) create mode 100644 .dockerignore mode change 100755 => 100644 Cargo.toml create mode 100644 Dockerfile create mode 100644 vue/.env.development create mode 100644 vue/.env.production create mode 100644 vue/Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..425a624 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.env +target/ +tests/ +Dockerfile +scripts/ +migrations/ + diff --git a/Cargo.lock b/Cargo.lock index 97421b5..36f6547 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -509,6 +509,21 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + [[package]] name = "crypto-common" version = "0.1.6" @@ -1299,6 +1314,15 @@ dependencies = [ "tendril", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matches" version = "0.1.10" @@ -1338,6 +1362,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "mutually_exclusive_features" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d02c0b00610773bb7fc61d85e13d86c7858cbdf00e1a120bfc41bc055dbaa0e" + [[package]] name = "native-tls" version = "0.2.11" @@ -1374,6 +1404,16 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-traits" version = "0.2.16" @@ -1404,9 +1444,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" @@ -1452,6 +1492,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking_lot" version = "0.12.1" @@ -1579,6 +1625,26 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.30", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1756,8 +1822,17 @@ checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.3.8", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -1768,9 +1843,15 @@ checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.5", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.7.5" @@ -1844,14 +1925,20 @@ dependencies = [ "hmac", "jwt", "log", + "once_cell", "reqwest", "rss", "scraper", + "secrecy", "serde", "serde_derive", "serde_json", "sha2", "tokio", + "tracing-actix-web", + "tracing-appender", + "tracing-log", + "tracing-subscriber", "uuid", ] @@ -1920,6 +2007,16 @@ dependencies = [ "tendril", ] +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "serde", + "zeroize", +] + [[package]] name = "security-framework" version = "2.9.2" @@ -2044,6 +2141,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -2199,6 +2305,36 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" +[[package]] +name = "thiserror" +version = "1.0.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e3de26b0965292219b4287ff031fcba86837900fe9cd2b34ea8ad893c0953d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "268026685b2be38d7103e9e507c938a1fcb3d7e6eb15e87870b617bf37b6d581" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.30", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "time" version = "0.3.30" @@ -2312,9 +2448,46 @@ dependencies = [ "cfg-if", "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-actix-web" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa069bd1503dd526ee793bb3fce408895136c95fc86d2edb2acf1c646d7f0684" +dependencies = [ + "actix-web", + "mutually_exclusive_features", + "pin-project", + "tracing", + "uuid", +] + +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.30", +] + [[package]] name = "tracing-core" version = "0.1.31" @@ -2322,6 +2495,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", ] [[package]] @@ -2382,14 +2585,20 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "uuid" -version = "1.4.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "getrandom 0.2.10", "serde", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/Cargo.toml b/Cargo.toml old mode 100755 new mode 100644 index 1f05dd6..c04db1f --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,12 @@ scraper = "0.14.0" actix-cors = "0.6.4" chrono = { version = "0.4.31", features = ["serde"] } dateparser = "0.2.0" +tracing-appender = "0.2.3" +once_cell = "1.19.0" +secrecy = { version = "0.8.0", features = ["serde"] } +tracing-actix-web = "0.7.10" +tracing-subscriber = { version = "0.3.18", features = ["registry", "env-filter"] } +tracing-log = "0.2.0" [dependencies.serde_json] version = "1.0.86" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..928d8d5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +FROM lukemathwalker/cargo-chef:latest-rust-1 AS chef +WORKDIR /app + +RUN apt update && apt install lld clang -y + +FROM chef as planner +COPY . . +RUN cargo chef prepare --recipe-path recipe.json + +FROM chef as builder +COPY --from=planner /app/recipe.json recipe.json + +RUN cargo chef cook --release --recipe-path recipe.json + +COPY . . +RUN cargo build --release --bin rss-reader +RUN cargo install diesel_cli --no-default-features --features postgres + +# Runtime stage +FROM debian:bookworm-slim AS runtime +WORKDIR /app +# Install OpenSSL - it is dynamically linked by some of our dependencies +# Install ca-certificates - it is needed to verify TLS certificates +# when establishing HTTPS connections +RUN apt-get update -y \ + && apt-get install -y openssl ca-certificates pkg-config\ + && apt-get install -y libpq5 \ + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* + +# Copy diesel_cli from builder to runtime +COPY --from=builder /usr/local/cargo/bin/diesel /usr/local/cargo/bin/diesel + +COPY --from=builder /app/target/release/rss-reader rss-reader + +EXPOSE 8001 +# COPY configuration configuration +# ENV APP_ENVIRONMENT production +# ENTRYPOINT ["./rss-reader"] +ENTRYPOINT ["sh", "-c", "/app/rss-reader && diesel migration run"] diff --git a/docker-compose.yml b/docker-compose.yml index 189b9dd..ad387d6 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,17 @@ version: "3.7" services: + + # vue-app: + # build: + # context: ./vue/ + # dockerfile: Dockerfile + # ports: + # - "8080:8080" # Adjust the port as needed for your Rust application + # networks: + # - app-network + postgres: + restart: always container_name: "rss-postgres" image: "postgres:15" ports: @@ -11,6 +22,23 @@ services: - "POSTGRES_PASSWORD=secret+123" volumes: - postgres_data:/var/lib/postgresql/data + networks: + - app-network + + # rust-app: + # build: + # context: . # Specify the path to your Rust application's Dockerfile + # dockerfile: Dockerfile + # ports: + # - "8001:8001" # Adjust the port as needed for your Rust application + # depends_on: + # - postgres + # networks: + # - app-network + +networks: + app-network: + driver: bridge volumes: postgres_data: diff --git a/vue/.env.development b/vue/.env.development new file mode 100644 index 0000000..bf9dfc9 --- /dev/null +++ b/vue/.env.development @@ -0,0 +1,2 @@ +VITE_API_BASE_URL=http://localhost:8001 + diff --git a/vue/.env.production b/vue/.env.production new file mode 100644 index 0000000..1376fe0 --- /dev/null +++ b/vue/.env.production @@ -0,0 +1,2 @@ +VITE_API_BASE_URL=http://rust-app:8001 + diff --git a/vue/Dockerfile b/vue/Dockerfile new file mode 100644 index 0000000..acc5fc8 --- /dev/null +++ b/vue/Dockerfile @@ -0,0 +1,22 @@ +FROM node:lts-alpine + +# install simple http server for serving static content +RUN npm install -g http-server + +# make the 'app' folder the current working directory +WORKDIR /app + +# copy both 'package.json' and 'package-lock.json' (if available) +COPY package*.json ./ + +# install project dependencies +RUN npm install + +# copy project files and folders to the current working directory (i.e. 'app' folder) +COPY . . + +# build app for production with minification +RUN npm run build + +EXPOSE 8080 +CMD [ "http-server", "dist" ] diff --git a/vue/package-lock.json b/vue/package-lock.json index f155d87..6b2fa34 100644 --- a/vue/package-lock.json +++ b/vue/package-lock.json @@ -18,6 +18,7 @@ "@rushstack/eslint-patch": "^1.3.2", "@vitejs/plugin-vue": "^4.3.1", "@vue/eslint-config-prettier": "^8.0.0", + "dotenv": "^16.4.5", "eslint": "^8.46.0", "eslint-plugin-vue": "^9.16.1", "prettier": "^3.0.0", @@ -1025,6 +1026,18 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", diff --git a/vue/package.json b/vue/package.json index 544d3a9..d40cb8c 100644 --- a/vue/package.json +++ b/vue/package.json @@ -20,6 +20,7 @@ "@rushstack/eslint-patch": "^1.3.2", "@vitejs/plugin-vue": "^4.3.1", "@vue/eslint-config-prettier": "^8.0.0", + "dotenv": "^16.4.5", "eslint": "^8.46.0", "eslint-plugin-vue": "^9.16.1", "prettier": "^3.0.0", diff --git a/vue/src/components/LoginPage.vue b/vue/src/components/LoginPage.vue index 137df86..0ea8e82 100644 --- a/vue/src/components/LoginPage.vue +++ b/vue/src/components/LoginPage.vue @@ -38,7 +38,7 @@ async function login() { localStorage.setItem("user-id", user_id) sessionStorage.setItem("user-id", user_id) sessionStorage.setItem("user-token", token) - router.push({ name: 'about' }) + router.push({ name: 'feeds' }) } // Handle success } catch (error) { diff --git a/vue/vite.config.js b/vue/vite.config.js index 0534b09..e6ec328 100644 --- a/vue/vite.config.js +++ b/vue/vite.config.js @@ -2,6 +2,14 @@ import { fileURLToPath, URL } from 'node:url' import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' +import dotenv from 'dotenv'; + +console.log('process.env:', process.env); +console.log('TEst:', process.env.VITE_API_BASE_URL); +// Load environment variables based on the environment mode +dotenv.config({ + path: `.env.${process.env.NODE_ENV || 'development'}` +}); // https://vitejs.dev/config/ export default defineConfig({ @@ -17,31 +25,31 @@ export default defineConfig({ server: { proxy: { '/login/rss': { - target: 'http://localhost:8001/api/v1/auth/login', + target: `${process.env.VITE_API_BASE_URL}/api/v1/auth/login`, changeOrigin: true, secure: false, rewrite: (path) => path.replace(/^\/login\/rss/, ''), }, '/feeds/get': { - target: 'http://localhost:8001/api/v1/article/get', + target: `${process.env.VITE_API_BASE_URL}/api/v1/article/get`, changeOrigin: true, secure: false, rewrite: (path) => path.replace(/^\/feeds\/get/, ''), }, '/feeds/sync': { - target: 'http://localhost:8001/api/v1/article/sync', + target: `${process.env.VITE_API_BASE_URL}/api/v1/article/sync`, changeOrigin: true, secure: false, rewrite: (path) => path.replace(/^\/feeds\/sync/, ''), }, '/feeds/read': { - target: 'http://localhost:8001/api/v1/article/read', + target: `${process.env.VITE_API_BASE_URL}/api/v1/article/read`, changeOrigin: true, secure: false, rewrite: (path) => path.replace(/^\/feeds\/read/, ''), }, '/feeds/add': { - target: 'http://localhost:8001/api/v1/article/add', + target: `${process.env.VITE_API_BASE_URL}/api/v1/article/add`, changeOrigin: true, secure: false, rewrite: (path) => path.replace(/^\/feeds\/add/, ''),