{"id":19209782,"url":"https://github.com/simonosaka/rust-web-server-axum","last_synced_at":"2025-10-06T02:22:42.939Z","repository":{"id":42995724,"uuid":"409412731","full_name":"SimonOsaka/rust-web-server-axum","owner":"SimonOsaka","description":"rust web backend example","archived":false,"fork":false,"pushed_at":"2024-10-18T01:46:25.000Z","size":1575,"stargazers_count":11,"open_issues_count":2,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-12T19:21:41.512Z","etag":null,"topics":["axum","postgresql","rust","sqlx"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SimonOsaka.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-09-23T01:50:48.000Z","updated_at":"2025-02-12T07:54:27.000Z","dependencies_parsed_at":"2024-11-09T13:39:43.370Z","dependency_job_id":"b9585e3e-a01d-4e93-96f4-bcbbcfa6ea0e","html_url":"https://github.com/SimonOsaka/rust-web-server-axum","commit_stats":null,"previous_names":["simonosaka/rust-web-server-axum","simonosaka/rust-web-server-example"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/SimonOsaka/rust-web-server-axum","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SimonOsaka%2Frust-web-server-axum","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SimonOsaka%2Frust-web-server-axum/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SimonOsaka%2Frust-web-server-axum/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SimonOsaka%2Frust-web-server-axum/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SimonOsaka","download_url":"https://codeload.github.com/SimonOsaka/rust-web-server-axum/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SimonOsaka%2Frust-web-server-axum/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278548018,"owners_count":26004818,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["axum","postgresql","rust","sqlx"],"created_at":"2024-11-09T13:33:08.194Z","updated_at":"2025-10-06T02:22:42.909Z","avatar_url":"https://github.com/SimonOsaka.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rust-web-server-example\n  learn rust web server and crates.\n\n## Structure\n- api: web request \u0026 response\n    - use axum\n\n- crates: third part crates, some crates are not latest, so clone and include it\n    - lettre\n    - tracing\n\n- domain: business service \u0026 impl\n\n- extra:\n    - authorization: rbac auth\n        - use casbin\n    - email: send email\n        - use lettre\n    - logger: log for everything\n        - use tracing\n    - meilisearch: search engine\n        - use meilisearch\n    - redis: memory and disk store\n        - use redis\n\n- macros\n    - use proc-macro2\n\n- repository: wrap database operation \u0026 sql\n    - use postgresql\n    - use sqlx\n\n- search: business service for search\n\n- server_app: main entry\n\n- server_lib: boot\n\n- util:\n    - date: date format and parse\n        - use time\n    - excel: export data to excel\n        - use xlsxwriter\n    - i18n: multi-languages\n    - jwt: resource auth\n        - use jsonwebtoken\n\n- vars: variables for all module\n\n## Prepare\n- Install Rust 1.56+\n- Install PostgreSQL 13+\n- Install MeiliSearch\n- Install Redis, optional\n\n\n## How to use sqlx migrations\n```shell\n# install sqlx-cli\ncargo install sqlx-cli --no-default-features --features postgres\n# create database from .env file of current workspace\n# add correct DATABASE_URL=..., no need create in database, sqlx will create it\nsqlx database create\n# create \u003ctimestamp\u003e_my_example.up.sql and \u003ctimestamp\u003e_my_example.down.sql\nsqlx migrate add -r my_example\n# run sql from \u003ctimestamp\u003e.up.sql\n# multi sql file, it's like going into the stack, all at once\nsqlx migrate run\n# revert sql from \u003ctimestamp\u003e.down.sql\n# only the most recent can be revert at a time, it's like going out of the stack\nsqlx migrate revert\n```\n#### sql raw\n```sql\n-- add column\nALTER TABLE table_name ADD COLUMN IF NOT EXISTS column_name column_type NOT NULL DEFAULT default_value;\n-- add column comment\nCOMMENT ON COLUMN table_name.column_name IS column_comment;\n-- drop column\nALTER TABLE table_name DROP COLUMN column_name;\n-- modify column type\nALTER TABLE table_name ALTER COLUMN column_name TYPE column_type;\n-- add column constraint\nALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE(column_name);\n-- drop column constraint\nALTER TABLE table_name DROP CONSTRAINT constraint_name;\n```\n\n## How to run\n- Open `.env` file\n- Config `DATABASE_URL`\n    - run shell command `sqlx database create`\n    - run shell command `sqlx migrate run`\n- Config `MEILISEARCH_URL` and `MEILISEARCH_KEY`\n- Add some data into database\n- Sync data from database to meilisearch\n    - sync, see [meilisearch-readme](search/README.md) `Sync from db to meilisearch` section.\n    - extra search conditions, see [meilisearch-readme](search/README.md) `settings` section.\n- `cargo build --release`\n- `cd target/release`\n- `./app`\n\n## tracing\n1. init to see source [logger/src/tracing_logger.rs](logger/src/tracing_logger.rs)\n    - environment variable `RUST_ENV`\n    - stderr, console output log in `development`\n    - file, path to log in `production`, `development`\n2. tracing log marco\n    - `tracing::debug!`\n    - `tracing::info!`\n    - `tracing::warn!`\n    - `tracing::error!`\n3. tracing method \n    - `#[tracing::instrument]` in library or async method\n    - `#[tracing::instrument(skip(transaction))]` ignore `transaction` param in method\n    - `#[tracing::instrument(skip(transaction), fields(name=%u.username))]` output `name=xxxx`\n    - `#[tracing::instrument(skip(transaction), fields(name=%u.username), err)]` err print\n\n## tokio-console\nWeb: [github/tokio-console](https://github.com/tokio-rs/console)\n1. add dependency\n```toml\nconsole-subscriber = \"0.1\"\n# features['tracing'] required\ntokio = { version = \"1\", features = [\"tracing\"] }\n```\n2. add init code to main function\n```rust\n#[tokio::main]\nasync fn main() {\n    console_subscriber::init();\n}\n```\n3. cargo run command with tokio-console\n```shell\nRUSTFLAGS=\"--cfg tokio_unstable\" cargo run\n```\n4. install tokio-console\n```shell\ncargo install tokio-console\n```\n5. run tokio-console\n```shell\ntokio-console\n# 'command/ctrl + click' 'console_subscriber::init();' to see ENV variables.\n```\n*For further to see docs*.\n\n## proc-macro2\n### macro\n- `#[proc_macro]`\n- `#[proc_macro_derive(MyDerive)]`\n- `#[proc_macro_attribute]`\n### required\n- proc-macro\n- syn\n- quote\n### watch macro expand\nInstall cargo-expand `cargo install cargo-expand` and shell run `cargo expand`\n\n**Tips**: run `cargo expand --lib \u003cfull mod path\u003e` to watch macro expand of path \n\n## Docker\n```shell\ndocker build -t rust-web-server-example:0.1.0 .\n\ndocker run -d -p 3030:3030 \\\n  -v /data/app/log:/apps/log/rust \\\n  --name app rust-web-server-example:0.1.0\n\n# or add custom env, replace .env file\n# docker run -d -p 3030:3030 \\\n#   -v /data/app/log:/apps/log/rust \\\n#   -e DATABASE_URL=\u003ctype your db url\u003e \\\n#   -e BIND_ADDRESS=\u003ctype your server address\u003e \\\n#   -e REDIS_URL=\u003ctype your redis url\u003e \\\n#   -e MEILISEARCH_URL=\u003ctype your search url\u003e \\\n#   -e MEILISEARCH_KEY=\u003ctype your search key\u003e \\\n#   --name app rust-web-server-example:0.1.0\n```\n#### LICENSE\nMIT","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonosaka%2Frust-web-server-axum","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsimonosaka%2Frust-web-server-axum","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonosaka%2Frust-web-server-axum/lists"}