fujin-cli 0.5.0__tar.gz → 0.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of fujin-cli might be problematic. Click here for more details.

Files changed (82) hide show
  1. fujin_cli-0.6.0/.github/workflows/publish.yml +169 -0
  2. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/.pre-commit-config.yaml +6 -0
  3. fujin_cli-0.6.0/CHANGELOG.md +7 -0
  4. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/PKG-INFO +8 -5
  5. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/README.md +6 -2
  6. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/app.rst +1 -1
  7. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/config.rst +1 -1
  8. fujin_cli-0.6.0/docs/commands/deploy.rst +67 -0
  9. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/docs.rst +1 -1
  10. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/down.rst +1 -1
  11. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/init.rst +1 -1
  12. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/proxy.rst +1 -1
  13. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/prune.rst +1 -1
  14. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/redeploy.rst +1 -1
  15. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/rollback.rst +1 -1
  16. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/secrets.rst +2 -2
  17. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/server.rst +1 -1
  18. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/up.rst +1 -1
  19. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/conf.py +1 -0
  20. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/configuration.rst +1 -1
  21. fujin_cli-0.6.0/docs/index.rst +52 -0
  22. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/installation.rst +1 -1
  23. fujin_cli-0.6.0/docs/requirements.txt +1090 -0
  24. fujin_cli-0.6.0/docs/tutorial.rst +337 -0
  25. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/examples/django/bookstore/fujin.toml +3 -6
  26. fujin_cli-0.6.0/examples/golang/pocketbase/fujin.toml +23 -0
  27. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/justfile +26 -15
  28. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/pyproject.toml +4 -4
  29. fujin_cli-0.6.0/src/fujin/__init__.py +0 -0
  30. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/init.py +0 -2
  31. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/config.py +7 -6
  32. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/proxies/nginx.py +14 -16
  33. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/uv.lock +36 -1
  34. fujin_cli-0.5.0/.github/workflows/publish.yml +0 -36
  35. fujin_cli-0.5.0/docs/commands/deploy.rst +0 -7
  36. fujin_cli-0.5.0/docs/index.rst +0 -32
  37. fujin_cli-0.5.0/docs/requirements.txt +0 -6
  38. fujin_cli-0.5.0/docs/tutorial.rst +0 -2
  39. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/.gitignore +0 -0
  40. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/.readthedocs.yaml +0 -0
  41. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/LICENSE.txt +0 -0
  42. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/Vagrantfile +0 -0
  43. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/changelog.rst +0 -0
  44. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/commands/index.rst +0 -0
  45. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/docs/hooks.rst +0 -0
  46. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/examples/django/bookstore/README.md +0 -0
  47. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/examples/django/bookstore/bookstore/__init__.py +0 -0
  48. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/examples/django/bookstore/bookstore/__main__.py +0 -0
  49. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/examples/django/bookstore/bookstore/asgi.py +0 -0
  50. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/examples/django/bookstore/bookstore/settings.py +0 -0
  51. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/examples/django/bookstore/bookstore/urls.py +0 -0
  52. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/examples/django/bookstore/bookstore/wsgi.py +0 -0
  53. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/examples/django/bookstore/manage.py +0 -0
  54. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/examples/django/bookstore/pyproject.toml +0 -0
  55. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/examples/django/bookstore/requirements.txt +0 -0
  56. /fujin_cli-0.5.0/src/fujin/__init__.py → /fujin_cli-0.6.0/examples/golang/pocketbase/.env.prod +0 -0
  57. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/__main__.py +0 -0
  58. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/__init__.py +0 -0
  59. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/_base.py +0 -0
  60. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/app.py +0 -0
  61. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/config.py +0 -0
  62. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/deploy.py +0 -0
  63. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/docs.py +0 -0
  64. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/down.py +0 -0
  65. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/proxy.py +0 -0
  66. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/prune.py +0 -0
  67. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/redeploy.py +0 -0
  68. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/rollback.py +0 -0
  69. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/secrets.py +0 -0
  70. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/server.py +0 -0
  71. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/commands/up.py +0 -0
  72. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/connection.py +0 -0
  73. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/errors.py +0 -0
  74. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/hooks.py +0 -0
  75. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/process_managers/__init__.py +0 -0
  76. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/process_managers/systemd.py +0 -0
  77. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/proxies/__init__.py +0 -0
  78. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/proxies/caddy.py +0 -0
  79. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/proxies/dummy.py +0 -0
  80. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/templates/simple.service +0 -0
  81. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/templates/web.service +0 -0
  82. {fujin_cli-0.5.0 → fujin_cli-0.6.0}/src/fujin/templates/web.socket +0 -0
@@ -0,0 +1,169 @@
1
+ name: Publish package
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*.*.*"
7
+
8
+ jobs:
9
+ build-python-wheel-and-sdist:
10
+ name: Build a pure Python wheel and source distribution
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Checkout code
14
+ uses: actions/checkout@v4
15
+
16
+ - name: Install uv
17
+ uses: astral-sh/setup-uv@v3
18
+
19
+ - name: Build
20
+ run: uv build
21
+
22
+ - uses: actions/upload-artifact@v4
23
+ with:
24
+ name: wheels
25
+ path: dist/*
26
+ if-no-files-found: error
27
+ overwrite: true
28
+
29
+ build-binaries:
30
+ name: Build binary application for ${{ matrix.job.target }} (${{ matrix.job.os }})
31
+ runs-on: ${{ matrix.job.os }}
32
+ needs: build-python-wheel-and-sdist
33
+ strategy:
34
+ fail-fast: false
35
+ matrix:
36
+ job:
37
+ # Linux
38
+ - target: x86_64-unknown-linux-gnu
39
+ os: ubuntu-latest
40
+ cross: true
41
+ release_suffix: x86_64-linux
42
+ - target: x86_64-unknown-linux-musl
43
+ os: ubuntu-latest
44
+ cross: true
45
+ release_suffix: x86_64-linux-musl
46
+ - target: aarch64-unknown-linux-gnu
47
+ os: ubuntu-latest
48
+ cross: true
49
+ release_suffix: aarch64-linux
50
+ # - target: i686-unknown-linux-gnu
51
+ # os: ubuntu-latest
52
+ # cross: true
53
+ # release_suffix: i686-linux
54
+ # Windows
55
+ - target: x86_64-pc-windows-msvc
56
+ os: windows-2022
57
+ release_suffix: x86_64-windows
58
+ - target: i686-pc-windows-msvc
59
+ os: windows-2022
60
+ release_suffix: i686-windows
61
+ # macOS
62
+ - target: aarch64-apple-darwin
63
+ os: macos-12
64
+ release_suffix: aarch64-osx
65
+ - target: x86_64-apple-darwin
66
+ os: macos-12
67
+ release_suffix: x86_64-osx
68
+
69
+ env:
70
+ CARGO_BUILD_TARGET: ${{ matrix.job.target }}
71
+
72
+ steps:
73
+ - name: Install uv
74
+ uses: astral-sh/setup-uv@v3
75
+
76
+ - name: Install just
77
+ uses: extractions/setup-just@v2
78
+
79
+ - name: Code Checkout
80
+ uses: actions/checkout@v4
81
+
82
+ - name: Install musl-tools on Linux
83
+ run: sudo apt-get install --yes musl musl-dev musl-tools
84
+ if: ${{ matrix.job.os == 'ubuntu-latest' }}
85
+
86
+ - name: Install Rust toolchain
87
+ if: ${{ !matrix.job.cross }}
88
+ uses: dtolnay/rust-toolchain@stable
89
+ with:
90
+ targets: ${{ matrix.job.target }}
91
+
92
+ - name: Set up cross compiling tools
93
+ if: matrix.job.cross
94
+ uses: taiki-e/setup-cross-toolchain-action@v1
95
+ with:
96
+ target: ${{ matrix.job.target}}
97
+
98
+ - name: Show toolchain information
99
+ run: |-
100
+ rustup toolchain list
101
+ rustup default
102
+ rustup -V
103
+ rustc -V
104
+ cargo -V
105
+ uv --version
106
+
107
+ - uses: actions/download-artifact@v4
108
+ with:
109
+ name: wheels
110
+ path: ${{ github.workspace }}/dist
111
+ merge-multiple: true
112
+
113
+ - name: Build binary
114
+ run: just build-bin
115
+
116
+ - name: Rename
117
+ working-directory: ${{ github.workspace }}
118
+ run: |-
119
+ mv dist/bin/fujin_cli* dist/bin/fujin_cli-${{ matrix.job.release_suffix }}
120
+
121
+ - name: Upload built binary package
122
+ uses: actions/upload-artifact@v4
123
+ with:
124
+ name: binaries-${{ matrix.job.release_suffix }}
125
+ path: dist/bin/*
126
+ if-no-files-found: error
127
+
128
+ publish-to-pypi:
129
+ name: Publish to PyPI
130
+ runs-on: ubuntu-latest
131
+ permissions:
132
+ id-token: write
133
+ needs: [build-python-wheel-and-sdist, build-binaries]
134
+ steps:
135
+ - name: Checkout code
136
+ uses: actions/checkout@v4
137
+
138
+ - uses: actions/download-artifact@v4
139
+ with:
140
+ name: wheels
141
+ path: dist
142
+
143
+ - uses: pypa/gh-action-pypi-publish@release/v1
144
+
145
+ release:
146
+ name: Create a GitHub release
147
+ runs-on: ubuntu-latest
148
+ permissions:
149
+ contents: write
150
+ needs: [build-python-wheel-and-sdist, build-binaries]
151
+ steps:
152
+ - name: Checkout code
153
+ uses: actions/checkout@v4
154
+
155
+ - uses: actions/download-artifact@v4
156
+ with:
157
+ path: dist
158
+ merge-multiple: true
159
+
160
+ - name: Generate Changelog
161
+ run: |
162
+ awk '/^## /{if (p) exit; p=1; next} p' ${{ github.workspace }}/CHANGELOG.md | tee ${{ github.workspace }}-CHANGELOG.txt
163
+
164
+ - name: Release
165
+ uses: softprops/action-gh-release@v2
166
+ with:
167
+ body_path: ${{ github.workspace }}-CHANGELOG.txt
168
+ files: dist/*
169
+ fail_on_unmatched_files: true
@@ -9,6 +9,12 @@ repos:
9
9
  language: system
10
10
  files: '\.py$'
11
11
 
12
+ - id: logchanges
13
+ name: update changelog
14
+ entry: just logchanges || true
15
+ language: system
16
+ pass_filenames: false
17
+
12
18
  - repo: https://github.com/myint/autoflake
13
19
  rev: v2.3.1
14
20
  hooks:
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ <!-- generated by git-cliff -->
@@ -1,12 +1,11 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fujin-cli
3
- Version: 0.5.0
4
- Summary: Add your description here
3
+ Version: 0.6.0
4
+ Summary: Get your project up and running in a few minutes on your own vps.
5
5
  Project-URL: Documentation, https://github.com/falcopackages/fujin#readme
6
6
  Project-URL: Issues, https://github.com/falcopackages/fujin/issues
7
7
  Project-URL: Source, https://github.com/falcopackages/fujin
8
8
  Author-email: Tobi DEGNON <tobidegnon@proton.me>
9
- License-File: LICENSE.txt
10
9
  Keywords: caddy,deployment,django,fastapi,litestar,python,systemd
11
10
  Classifier: Development Status :: 3 - Alpha
12
11
  Classifier: Intended Audience :: Developers
@@ -37,16 +36,18 @@ Description-Content-Type: text/markdown
37
36
  > [!IMPORTANT]
38
37
  > This package currently contains minimal features and is a work-in-progress
39
38
 
39
+ <!-- content:start -->
40
+
40
41
  `fujin` is a simple deployment tool that helps you get your project up and running on a VPS in a few minutes. It manages your app processes using `systemd` and runs your apps behind [caddy](https://caddyserver.com/). For Python projects,
41
42
  it expects your app to be a packaged Python application ideally with a CLI entry point defined. For other languages, you need to provide a self-contained single executable file with all necessary dependencies.
42
43
  The main job of `fujin` is to bootstrap your server (installing caddy, etc.), copy the files onto the server with a structure that supports rollback, and automatically generate configs for systemd and caddy that you can manually edit if needed.
43
44
 
44
- Check out the [documentation📚](https://fujin.readthedocs.io/en/latest/) for installation, features, and usage guides.
45
+ Check out the [documentation📚](https://fujin.oluwatobi.dev/en/latest/) for installation, features, and usage guides.
45
46
 
46
47
  ## Why?
47
48
 
48
49
  I wanted [kamal](https://kamal-deploy.org/) but without Docker, and I thought the idea was fun. At its core, this project automates versions of this [tutorial](https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu). If you've been a Django beginner
49
- trying to get your app in production, you probably went through this. I'm using caddy instead of nginx because the configuration file simpler and it's is a no-brainer for SSL certificates. Systemd is the default on most Linux distributions and does a good enough job.
50
+ trying to get your app in production, you probably went through this. I'm using caddy instead of nginx because it's configurable via an API and it's is a no-brainer for SSL certificates. Systemd is the default on most Linux distributions and does a good enough job.
50
51
 
51
52
  Fujin was initially planned to be a Python-only project, but the core concepts can be applied to any language that can produce a single distributable file (e.g., Go, Rust). I wanted to recreate kamal's nice local-to-remote app management API, but I'm skipping Docker to keep things simple.
52
53
  I'm currently rocking SQLite in production for my side projects and ths setup is enough for my use case.
@@ -64,3 +65,5 @@ Fujin draws inspiration from the following tools for their developer experience.
64
65
  ## License
65
66
 
66
67
  `fujin` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.
68
+
69
+ <!-- content:end -->
@@ -9,16 +9,18 @@
9
9
  > [!IMPORTANT]
10
10
  > This package currently contains minimal features and is a work-in-progress
11
11
 
12
+ <!-- content:start -->
13
+
12
14
  `fujin` is a simple deployment tool that helps you get your project up and running on a VPS in a few minutes. It manages your app processes using `systemd` and runs your apps behind [caddy](https://caddyserver.com/). For Python projects,
13
15
  it expects your app to be a packaged Python application ideally with a CLI entry point defined. For other languages, you need to provide a self-contained single executable file with all necessary dependencies.
14
16
  The main job of `fujin` is to bootstrap your server (installing caddy, etc.), copy the files onto the server with a structure that supports rollback, and automatically generate configs for systemd and caddy that you can manually edit if needed.
15
17
 
16
- Check out the [documentation📚](https://fujin.readthedocs.io/en/latest/) for installation, features, and usage guides.
18
+ Check out the [documentation📚](https://fujin.oluwatobi.dev/en/latest/) for installation, features, and usage guides.
17
19
 
18
20
  ## Why?
19
21
 
20
22
  I wanted [kamal](https://kamal-deploy.org/) but without Docker, and I thought the idea was fun. At its core, this project automates versions of this [tutorial](https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu). If you've been a Django beginner
21
- trying to get your app in production, you probably went through this. I'm using caddy instead of nginx because the configuration file simpler and it's is a no-brainer for SSL certificates. Systemd is the default on most Linux distributions and does a good enough job.
23
+ trying to get your app in production, you probably went through this. I'm using caddy instead of nginx because it's configurable via an API and it's is a no-brainer for SSL certificates. Systemd is the default on most Linux distributions and does a good enough job.
22
24
 
23
25
  Fujin was initially planned to be a Python-only project, but the core concepts can be applied to any language that can produce a single distributable file (e.g., Go, Rust). I wanted to recreate kamal's nice local-to-remote app management API, but I'm skipping Docker to keep things simple.
24
26
  I'm currently rocking SQLite in production for my side projects and ths setup is enough for my use case.
@@ -36,3 +38,5 @@ Fujin draws inspiration from the following tools for their developer experience.
36
38
  ## License
37
39
 
38
40
  `fujin` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.
41
+
42
+ <!-- content:end -->
@@ -1,4 +1,4 @@
1
- App
1
+ app
2
2
  ===
3
3
 
4
4
  .. cappa:: fujin.commands.app.App
@@ -1,4 +1,4 @@
1
- Config
1
+ config
2
2
  ======
3
3
 
4
4
  .. cappa:: fujin.commands.config.ConfigCMD
@@ -0,0 +1,67 @@
1
+ deploy
2
+ ======
3
+
4
+
5
+ .. cappa:: fujin.commands.deploy.Deploy
6
+ :style: terminal
7
+ :terminal-width: 0
8
+
9
+
10
+ How it works
11
+ ------------
12
+
13
+ Here's a high-level overview of what happens when you run the ``deploy`` command:
14
+
15
+ 1. **Build the Application**: Your application is built using the ``build_command`` specified in your configuration.
16
+
17
+ 2. **Transfer Files**: The environment variables file (``.env``) and the distribution file are transferred to the remote server. Optionally transfers ``requirements`` file (if specified).
18
+
19
+ 3. **Install the Project**: Depending on the installation mode (Python package or binary), the project is installed on the remote server. For a Python package, a virtual environment is set up, dependencies are installed, and the distribution file (the wheel file) is then installed. For a binary, the binary file for the latest version is linked to the root of the application directory.
20
+
21
+ 4. **Application Release**: If a ``release_command`` is specified in the configuration, it is executed at this stage.
22
+
23
+ 5. **Configure and Start Services**: Configuration files for both ``systemd`` and the ``proxy`` (e.g., Caddy, by default) are generated or copied if previously exported. These configuration files are moved to their appropriate directories. A configuration reload is performed, and all relevant services are restarted.
24
+
25
+ 6. **Update Version History**: The deployed version is recorded in the ``.versions`` file on the remote server.
26
+
27
+ 7. **Prune Old Assets**: Old versions of the application are removed based on the ``versions_to_keep`` configuration.
28
+
29
+ 8. **Completion**: A success message is displayed, and the URL to access the deployed project is provided.
30
+
31
+ Below is an example file layout and structure of the deployed application:
32
+
33
+ .. tab-set::
34
+
35
+ .. tab-item:: python package
36
+
37
+ .. code-block:: shell
38
+
39
+ app_directory/
40
+ ├── .env # Environment variables file
41
+ ├── .appenv # Application-specific environment setup
42
+ ├── .versions # Version tracking file
43
+ ├── .venv/ # Virtual environment
44
+ ├── v1.2.3/ # Versioned asset directory
45
+ │ ├── app-1.2.3-py3-none-any.whl # Distribution file
46
+ │ └── requirements.txt # Optional requirements file
47
+ ├── v1.2.2/
48
+ │ └── ...
49
+ └── v1.2.1/
50
+ └── ...
51
+
52
+ .. tab-item:: binary
53
+
54
+ .. code-block:: shell
55
+
56
+ app_directory/
57
+ ├── .env # Environment variables file
58
+ ├── .appenv # Application-specific environment setup
59
+ ├── .versions # Version tracking file
60
+ ├── app_binary -> v1.2.3/app_binary # Symbolic link to current version
61
+ ├── v1.2.3/ # Versioned asset directory
62
+ │ └── app_binary # Distribution file
63
+ ├── v1.2.2/
64
+ │ └── ...
65
+ └── v1.2.1/
66
+ └── ...
67
+
@@ -1,4 +1,4 @@
1
- Docs
1
+ docs
2
2
  ====
3
3
 
4
4
  .. cappa:: fujin.commands.docs.Docs
@@ -1,4 +1,4 @@
1
- Down
1
+ down
2
2
  ====
3
3
 
4
4
  .. cappa:: fujin.commands.down.Down
@@ -1,4 +1,4 @@
1
- Init
1
+ init
2
2
  ====
3
3
 
4
4
  .. cappa:: fujin.commands.init.Init
@@ -1,4 +1,4 @@
1
- Proxy
1
+ proxy
2
2
  ======
3
3
 
4
4
  .. cappa:: fujin.commands.proxy.Proxy
@@ -1,4 +1,4 @@
1
- Prune
1
+ prune
2
2
  ======
3
3
 
4
4
  .. cappa:: fujin.commands.prune.Prune
@@ -1,4 +1,4 @@
1
- Redeploy
1
+ redeploy
2
2
  ========
3
3
 
4
4
  .. cappa:: fujin.commands.redeploy.Redeploy
@@ -1,4 +1,4 @@
1
- Rollback
1
+ rollback
2
2
  ========
3
3
 
4
4
  .. cappa:: fujin.commands.rollback.Rollback
@@ -1,5 +1,5 @@
1
- Secrets
2
- ======
1
+ secrets
2
+ =======
3
3
 
4
4
  .. cappa:: fujin.commands.secrets.Secrets
5
5
  :style: terminal
@@ -1,4 +1,4 @@
1
- Server
1
+ server
2
2
  ======
3
3
 
4
4
  .. cappa:: fujin.commands.up.Server
@@ -1,4 +1,4 @@
1
- Up
1
+ up
2
2
  ==
3
3
 
4
4
  .. cappa:: fujin.commands.up.Up
@@ -21,6 +21,7 @@ extensions = [
21
21
  "sphinx_design",
22
22
  "sphinx_copybutton",
23
23
  "jupyter_sphinx",
24
+ "sphinx_togglebutton",
24
25
  ]
25
26
 
26
27
  templates_path = ["_templates"]
@@ -11,7 +11,7 @@ This is a minimal working example.
11
11
 
12
12
  .. tab-set::
13
13
 
14
- .. tab-item:: simple python package
14
+ .. tab-item:: python package
15
15
 
16
16
  .. jupyter-execute::
17
17
  :hide-code:
@@ -0,0 +1,52 @@
1
+ .. fujin documentation master file, created by
2
+ sphinx-quickstart on Tue Oct 29 14:01:13 2024.
3
+ You can adapt this file completely to your liking, but it should at least
4
+ contain the root `toctree` directive.
5
+
6
+ fujin documentation
7
+ ===================
8
+
9
+
10
+ .. important::
11
+
12
+ This a work in progress, not ready for production use yet.
13
+
14
+ .. container:: badges
15
+ :name: badges
16
+
17
+ .. image:: https://img.shields.io/pypi/pyversions/fujin-cli.svg
18
+ :alt: Python versions
19
+
20
+ .. image:: https://github.com/falcopackages/fujin/actions/workflows/publish.yml/badge.svg
21
+ :alt: Github Actions Publish Status
22
+
23
+ .. image:: https://img.shields.io/badge/license-MIT-blue.svg
24
+ :alt: License
25
+
26
+ .. image:: https://readthedocs.org/projects/fujin/badge/?version=latest&style=flat
27
+ :alt: Documentation Status
28
+
29
+ .. image:: https://img.shields.io/pypi/v/fujin-cli.svg
30
+ :alt: PyPI Version
31
+
32
+ .. raw:: html
33
+
34
+ <script src="https://asciinema.org/a/687274.js" id="asciicast-687274" async="true"></script>
35
+
36
+ .. include:: ../README.md
37
+ :parser: myst_parser.sphinx_
38
+ :start-after: <!-- content:start -->
39
+ :end-before: <!-- content:end -->
40
+
41
+ .. toctree::
42
+ :maxdepth: 2
43
+ :caption: Contents:
44
+ :hidden:
45
+
46
+ installation
47
+ tutorial
48
+ configuration
49
+ commands/index
50
+ hooks
51
+ changelog
52
+
@@ -13,4 +13,4 @@ Installation
13
13
 
14
14
  .. code-block:: bash
15
15
 
16
- https://docs.astral.sh/uv/getting-started/installation/
16
+ curl -LsSf https://astral.sh/uv/install.sh | sh