diff --git a/.env.example b/.env.example index 6ef454f..1a3afd6 100644 --- a/.env.example +++ b/.env.example @@ -3,6 +3,7 @@ ADMIN_TOKEN= STRIPE_TOKEN= FORGEJO_URL=http://localhost:3000 DATABASE_URL=sqlite://queenie.db +DATABASE_FILE=file://queenie.db MONTHLY_LINK= ANNUAL_LINK= LISTENING_ADDR=127.0.0.1 diff --git a/.gitignore b/.gitignore index 1b3cb3c..0230799 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ /target -.env +*.env *.db *.db-* diff --git a/README.md b/README.md index e854a69..92a99ee 100644 --- a/README.md +++ b/README.md @@ -19,9 +19,12 @@ sqlx db create ; sqlx migrate run Run the server for development: ``` -cargo run +cargo run -- -e .env ``` +The `-e` (or `--env`) option tells Queenie where to find its environment configuration file; the +default is `/etc/forgejo/queenie.env`. + The assets used in Queen come from forgejo, so you can use a local Caddyfile to serve both forgejo and `queen` (assuming that forgejo is running on localhost:3000): @@ -43,3 +46,7 @@ Run caddy with: ``` caddy run --config Caddyfile ``` + +## Use in production + +There's a sample systemd unit file, `queenie.service`. diff --git a/queenie.service b/queenie.service new file mode 100644 index 0000000..08da185 --- /dev/null +++ b/queenie.service @@ -0,0 +1,16 @@ +[Unit] +Description=Queenie guards the kitten den. +After=syslog.target +After=network.target + +[Service] +Type=simple +User=git +Group=git +WorkingDirectory=/var/lib/forgejo/ +ExecStart=/var/lib/forgejo/bin/queenie --env /etc/forgejo/queenie.env +Restart=always +Environment=USER=git HOME=/home/git + +[Install] +WantedBy=multi-user.target diff --git a/src/main.rs b/src/main.rs index 1619bb4..7a49923 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,8 +30,6 @@ async fn main() { let pool = db().await; - sqlx::migrate!().run(&pool).await.unwrap(); - // the core application, defining the routes and handlers let app = Router::new() .stripped_clone("/signup/", get(get_signup).post(post_signup)) @@ -52,8 +50,14 @@ async fn main() { // li'l helpers //-************************************************************************ #[derive(Debug, Parser)] +#[clap(version, about)] struct Cli { - #[clap(long, short)] + #[clap( + long, + short, + help = "Path to Queenie's environment config file", + default_value = "/etc/forgejo/queenie.env" + )] pub env: OsString, } @@ -69,13 +73,27 @@ fn init() { } async fn db() -> SqlitePool { - //let dbfile = std::env::var("DATABASE_URL").unwrap(); + let dbfile = std::env::var("DATABASE_FILE").unwrap(); let opts = SqliteConnectOptions::new() .foreign_keys(true) .create_if_missing(true) .journal_mode(sqlx::sqlite::SqliteJournalMode::Wal) + .filename(&dbfile) .optimize_on_close(true, None); - SqlitePoolOptions::new().connect_with(opts).await.unwrap() + let pool = SqlitePoolOptions::new() + .connect_with(opts.clone()) + .await + .unwrap(); + + sqlx::migrate!().run(&pool).await.unwrap(); + + let count = sqlx::query_scalar!("select count(*) from customers") + .fetch_one(&pool) + .await + .expect("could not get customer count from DB"); + log::info!("Connected to DB, found {count} customers."); + + pool } async fn mklistener() -> TcpListener {