fujin-cli 0.1.0__tar.gz → 0.3.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.
- fujin_cli-0.3.0/.github/workflows/publish.yml +36 -0
- fujin_cli-0.3.0/.gitignore +152 -0
- fujin_cli-0.3.0/.pre-commit-config.yaml +30 -0
- fujin_cli-0.3.0/.readthedocs.yaml +24 -0
- fujin_cli-0.3.0/PKG-INFO +66 -0
- fujin_cli-0.3.0/README.md +38 -0
- fujin_cli-0.3.0/Vagrantfile +79 -0
- fujin_cli-0.3.0/docs/changelog.rst +2 -0
- fujin_cli-0.3.0/docs/commands/app.rst +6 -0
- fujin_cli-0.3.0/docs/commands/config.rst +6 -0
- fujin_cli-0.3.0/docs/commands/deploy.rst +7 -0
- fujin_cli-0.3.0/docs/commands/docs.rst +6 -0
- fujin_cli-0.3.0/docs/commands/down.rst +6 -0
- fujin_cli-0.3.0/docs/commands/index.rst +24 -0
- fujin_cli-0.3.0/docs/commands/init.rst +6 -0
- fujin_cli-0.3.0/docs/commands/proxy.rst +7 -0
- fujin_cli-0.3.0/docs/commands/prune.rst +7 -0
- fujin_cli-0.3.0/docs/commands/redeploy.rst +6 -0
- fujin_cli-0.3.0/docs/commands/rollback.rst +7 -0
- fujin_cli-0.3.0/docs/commands/secrets.rst +7 -0
- fujin_cli-0.3.0/docs/commands/server.rst +16 -0
- fujin_cli-0.3.0/docs/commands/up.rst +6 -0
- fujin_cli-0.3.0/docs/conf.py +42 -0
- fujin_cli-0.3.0/docs/configuration.rst +18 -0
- fujin_cli-0.3.0/docs/hooks.rst +2 -0
- fujin_cli-0.3.0/docs/index.rst +29 -0
- fujin_cli-0.3.0/docs/installation.rst +16 -0
- fujin_cli-0.3.0/docs/requirements.txt +6 -0
- fujin_cli-0.3.0/docs/tutorial.rst +2 -0
- fujin_cli-0.3.0/examples/django/bookstore/README.md +200 -0
- fujin_cli-0.3.0/examples/django/bookstore/bookstore/__init__.py +0 -0
- fujin_cli-0.3.0/examples/django/bookstore/bookstore/__main__.py +23 -0
- fujin_cli-0.3.0/examples/django/bookstore/bookstore/asgi.py +16 -0
- fujin_cli-0.3.0/examples/django/bookstore/bookstore/settings.py +125 -0
- fujin_cli-0.3.0/examples/django/bookstore/bookstore/urls.py +23 -0
- fujin_cli-0.3.0/examples/django/bookstore/bookstore/wsgi.py +16 -0
- fujin_cli-0.3.0/examples/django/bookstore/fujin.toml +37 -0
- fujin_cli-0.3.0/examples/django/bookstore/manage.py +0 -0
- fujin_cli-0.3.0/examples/django/bookstore/pyproject.toml +18 -0
- fujin_cli-0.3.0/examples/django/bookstore/requirements.txt +23 -0
- fujin_cli-0.3.0/justfile +79 -0
- fujin_cli-0.3.0/pyproject.toml +259 -0
- fujin_cli-0.3.0/src/fujin/__init__.py +0 -0
- fujin_cli-0.3.0/src/fujin/__main__.py +71 -0
- fujin_cli-0.3.0/src/fujin/commands/__init__.py +2 -0
- fujin_cli-0.3.0/src/fujin/commands/_base.py +76 -0
- fujin_cli-0.3.0/src/fujin/commands/app.py +138 -0
- fujin_cli-0.3.0/src/fujin/commands/config.py +65 -0
- fujin_cli-0.3.0/src/fujin/commands/deploy.py +116 -0
- fujin_cli-0.3.0/src/fujin/commands/docs.py +16 -0
- fujin_cli-0.3.0/src/fujin/commands/down.py +48 -0
- fujin_cli-0.3.0/src/fujin/commands/init.py +82 -0
- fujin_cli-0.3.0/src/fujin/commands/proxy.py +71 -0
- fujin_cli-0.3.0/src/fujin/commands/prune.py +42 -0
- fujin_cli-0.3.0/src/fujin/commands/redeploy.py +48 -0
- fujin_cli-0.3.0/src/fujin/commands/rollback.py +49 -0
- fujin_cli-0.3.0/src/fujin/commands/secrets.py +11 -0
- fujin_cli-0.3.0/src/fujin/commands/server.py +92 -0
- fujin_cli-0.3.0/src/fujin/commands/up.py +15 -0
- fujin_cli-0.3.0/src/fujin/config.py +290 -0
- fujin_cli-0.3.0/src/fujin/connection.py +75 -0
- fujin_cli-0.3.0/src/fujin/errors.py +5 -0
- fujin_cli-0.3.0/src/fujin/hooks.py +55 -0
- fujin_cli-0.3.0/src/fujin/process_managers/__init__.py +40 -0
- fujin_cli-0.3.0/src/fujin/process_managers/systemd.py +155 -0
- fujin_cli-0.3.0/src/fujin/proxies/__init__.py +35 -0
- fujin_cli-0.3.0/src/fujin/proxies/caddy.py +214 -0
- fujin_cli-0.3.0/src/fujin/proxies/dummy.py +29 -0
- fujin_cli-0.3.0/src/fujin/proxies/nginx.py +132 -0
- fujin_cli-0.3.0/src/fujin/templates/simple.service +14 -0
- fujin_cli-0.3.0/src/fujin/templates/web.service +25 -0
- fujin_cli-0.3.0/src/fujin/templates/web.socket +11 -0
- fujin_cli-0.3.0/uv.lock +2337 -0
- fujin_cli-0.1.0/.gitignore +0 -10
- fujin_cli-0.1.0/.python-version +0 -1
- fujin_cli-0.1.0/PKG-INFO +0 -41
- fujin_cli-0.1.0/README.md +0 -26
- fujin_cli-0.1.0/pyproject.toml +0 -26
- fujin_cli-0.1.0/src/fujin/__init__.py +0 -2
- fujin_cli-0.1.0/src/fujin/fabfile.py +0 -202
- fujin_cli-0.1.0/src/fujin/utils.py +0 -60
- {fujin_cli-0.1.0 → fujin_cli-0.3.0}/LICENSE.txt +0 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
name: Publish package
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*.*.*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
publish:
|
|
10
|
+
name: Publish to pypi
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- name: Install uv
|
|
14
|
+
uses: astral-sh/setup-uv@v3
|
|
15
|
+
- name: Build Wheel
|
|
16
|
+
run: uv build
|
|
17
|
+
- name: Publish
|
|
18
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
19
|
+
|
|
20
|
+
release:
|
|
21
|
+
name: Create a GitHub release
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
permissions:
|
|
24
|
+
contents: write
|
|
25
|
+
steps:
|
|
26
|
+
- name: Checkout code
|
|
27
|
+
uses: actions/checkout@v4
|
|
28
|
+
- name: Generate Changelog
|
|
29
|
+
run: |
|
|
30
|
+
awk '/^## /{if (p) exit; p=1; next} p' ${{ github.workspace }}/CHANGELOG.md | tee ${{ github.workspace }}-CHANGELOG.txt
|
|
31
|
+
- name: Release
|
|
32
|
+
uses: softprops/action-gh-release@v2
|
|
33
|
+
with:
|
|
34
|
+
body_path: ${{ github.workspace }}-CHANGELOG.txt
|
|
35
|
+
files: dist/*
|
|
36
|
+
fail_on_unmatched_files: true
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
pip-wheel-metadata/
|
|
24
|
+
share/python-wheels/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.installed.cfg
|
|
27
|
+
*.egg
|
|
28
|
+
MANIFEST
|
|
29
|
+
|
|
30
|
+
# PyInstaller
|
|
31
|
+
# Usually these files are written by a python script from a template
|
|
32
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
33
|
+
*.manifest
|
|
34
|
+
*.spec
|
|
35
|
+
|
|
36
|
+
# Installer logs
|
|
37
|
+
pip-log.txt
|
|
38
|
+
pip-delete-this-directory.txt
|
|
39
|
+
|
|
40
|
+
# Unit test / coverage reports
|
|
41
|
+
htmlcov/
|
|
42
|
+
.tox/
|
|
43
|
+
.nox/
|
|
44
|
+
.coverage
|
|
45
|
+
.coverage.*
|
|
46
|
+
.cache
|
|
47
|
+
nosetests.xml
|
|
48
|
+
coverage.xml
|
|
49
|
+
*.cover
|
|
50
|
+
*.py,cover
|
|
51
|
+
.hypothesis/
|
|
52
|
+
.pytest_cache/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
*.sqlite3
|
|
62
|
+
*.sqlite3-journal
|
|
63
|
+
*.sqlite3-shm
|
|
64
|
+
*.sqlite3-wal
|
|
65
|
+
*.db
|
|
66
|
+
*.db-journal
|
|
67
|
+
*.db-shm
|
|
68
|
+
*.db-wal
|
|
69
|
+
*staticfiles/
|
|
70
|
+
*media
|
|
71
|
+
|
|
72
|
+
# db dumps
|
|
73
|
+
*.dump
|
|
74
|
+
|
|
75
|
+
# Flask stuff:
|
|
76
|
+
instance/
|
|
77
|
+
.webassets-cache
|
|
78
|
+
|
|
79
|
+
# Scrapy stuff:
|
|
80
|
+
.scrapy
|
|
81
|
+
|
|
82
|
+
# Sphinx documentation
|
|
83
|
+
docs/_build/
|
|
84
|
+
|
|
85
|
+
# PyBuilder
|
|
86
|
+
target/
|
|
87
|
+
|
|
88
|
+
# Jupyter Notebook
|
|
89
|
+
.ipynb_checkpoints
|
|
90
|
+
|
|
91
|
+
# IPython
|
|
92
|
+
profile_default/
|
|
93
|
+
ipython_config.py
|
|
94
|
+
|
|
95
|
+
# pyenv
|
|
96
|
+
.python-version
|
|
97
|
+
|
|
98
|
+
# pipenv
|
|
99
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
100
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
101
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
102
|
+
# install all needed dependencies.
|
|
103
|
+
#Pipfile.lock
|
|
104
|
+
|
|
105
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
|
106
|
+
__pypackages__/
|
|
107
|
+
|
|
108
|
+
# Celery stuff
|
|
109
|
+
celerybeat-schedule
|
|
110
|
+
celerybeat.pid
|
|
111
|
+
|
|
112
|
+
# SageMath parsed files
|
|
113
|
+
*.sage.py
|
|
114
|
+
|
|
115
|
+
# Environments
|
|
116
|
+
.env
|
|
117
|
+
examples/django/bookstore/.env.prod
|
|
118
|
+
.venv
|
|
119
|
+
env/
|
|
120
|
+
venv/
|
|
121
|
+
ENV/
|
|
122
|
+
env.bak/
|
|
123
|
+
venv.bak/
|
|
124
|
+
|
|
125
|
+
# Spyder project settings
|
|
126
|
+
.spyderproject
|
|
127
|
+
.spyproject
|
|
128
|
+
|
|
129
|
+
# Rope project settings
|
|
130
|
+
.ropeproject
|
|
131
|
+
|
|
132
|
+
# mkdocs documentation
|
|
133
|
+
/site
|
|
134
|
+
|
|
135
|
+
# mypy
|
|
136
|
+
.mypy_cache/
|
|
137
|
+
.dmypy.json
|
|
138
|
+
dmypy.json
|
|
139
|
+
|
|
140
|
+
# Pyre type checker
|
|
141
|
+
.pyre/
|
|
142
|
+
|
|
143
|
+
# Pycharm
|
|
144
|
+
.idea/
|
|
145
|
+
|
|
146
|
+
# MacOs
|
|
147
|
+
.DS_Store
|
|
148
|
+
|
|
149
|
+
id_rsa
|
|
150
|
+
id_rsa.pub
|
|
151
|
+
aws.pem
|
|
152
|
+
.vagrant
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# See https://pre-commit.com for more information
|
|
2
|
+
# See https://pre-commit.com/hooks.html for more hooks
|
|
3
|
+
repos:
|
|
4
|
+
- repo: local
|
|
5
|
+
hooks:
|
|
6
|
+
- id: fmt
|
|
7
|
+
name: ruff format
|
|
8
|
+
entry: uvx ruff format
|
|
9
|
+
language: system
|
|
10
|
+
files: '\.py$'
|
|
11
|
+
|
|
12
|
+
- repo: https://github.com/myint/autoflake
|
|
13
|
+
rev: v2.3.1
|
|
14
|
+
hooks:
|
|
15
|
+
- id: autoflake
|
|
16
|
+
exclude: .*/__init__.py
|
|
17
|
+
args:
|
|
18
|
+
- --in-place
|
|
19
|
+
- --remove-all-unused-imports
|
|
20
|
+
- --expand-star-imports
|
|
21
|
+
- --remove-duplicate-keys
|
|
22
|
+
- --remove-unused-variables
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
- repo: https://github.com/tox-dev/pyproject-fmt
|
|
26
|
+
rev: "v2.5.0"
|
|
27
|
+
hooks:
|
|
28
|
+
- id: pyproject-fmt
|
|
29
|
+
args: [ "pyproject.toml" ]
|
|
30
|
+
exclude: ^(examples/)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Read the Docs configuration file
|
|
2
|
+
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
|
3
|
+
|
|
4
|
+
# Required
|
|
5
|
+
version: 2
|
|
6
|
+
|
|
7
|
+
# Set the OS, Python version, and other tools you might need
|
|
8
|
+
build:
|
|
9
|
+
os: ubuntu-22.04
|
|
10
|
+
tools:
|
|
11
|
+
python: "3.12"
|
|
12
|
+
|
|
13
|
+
# Build documentation in the "docs/" directory with Sphinx
|
|
14
|
+
sphinx:
|
|
15
|
+
configuration: docs/conf.py
|
|
16
|
+
|
|
17
|
+
# Optionally, but recommended,
|
|
18
|
+
# declare the Python requirements required to build your documentation
|
|
19
|
+
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
|
|
20
|
+
python:
|
|
21
|
+
install:
|
|
22
|
+
- requirements: docs/requirements.txt
|
|
23
|
+
|
|
24
|
+
|
fujin_cli-0.3.0/PKG-INFO
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: fujin-cli
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Add your description here
|
|
5
|
+
Project-URL: Documentation, https://github.com/falcopackages/fujin#readme
|
|
6
|
+
Project-URL: Issues, https://github.com/falcopackages/fujin/issues
|
|
7
|
+
Project-URL: Source, https://github.com/falcopackages/fujin
|
|
8
|
+
Author-email: Tobi DEGNON <tobidegnon@proton.me>
|
|
9
|
+
License-File: LICENSE.txt
|
|
10
|
+
Keywords: caddy,deployment,django,fastapi,litestar,python,systemd
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Natural Language :: English
|
|
14
|
+
Classifier: Programming Language :: Python
|
|
15
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
21
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Requires-Dist: cappa>=0.24
|
|
24
|
+
Requires-Dist: fabric>=3.2.2
|
|
25
|
+
Requires-Dist: msgspec[toml]>=0.18.6
|
|
26
|
+
Requires-Dist: rich>=13.9.2
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
# fujin
|
|
30
|
+
|
|
31
|
+
[](https://pypi.org/project/fujin-cli)
|
|
32
|
+
[](https://pypi.org/project/fujin-cli)
|
|
33
|
+
[](https://github.com/falcopackages/fujin/blob/main/LICENSE.txt)
|
|
34
|
+
[](https://pypi.org/project/fujin-cli)
|
|
35
|
+
-----
|
|
36
|
+
|
|
37
|
+
> [!IMPORTANT]
|
|
38
|
+
> This package currently contains minimal features and is a work-in-progress
|
|
39
|
+
|
|
40
|
+
`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
|
+
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
|
+
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
|
+
Check out the [documentation📚](https://fujin.readthedocs.io/en/latest/) for installation, features, and usage guides.
|
|
45
|
+
|
|
46
|
+
## Why?
|
|
47
|
+
|
|
48
|
+
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
|
+
|
|
51
|
+
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
|
+
I'm currently rocking SQLite in production for my side projects and ths setup is enough for my use case.
|
|
53
|
+
|
|
54
|
+
The goal is to automate deployment while leaving you in full control of your Linux box. It's not a CLI PaaS - it's simple and expects you to be able to SSH into your server and troubleshoot if necessary. For beginners, it makes the initial deployment easier while you get your hands dirty with Linux.
|
|
55
|
+
If you need a never-break, worry-free, set-it-and-forget-it setup that auto-scales and does all the magic, fujin probably isn't for you.
|
|
56
|
+
|
|
57
|
+
## Inspiration and alternatives
|
|
58
|
+
|
|
59
|
+
Fujin draws inspiration from the following tools for their developer experience. These are better alternatives if you need a more robust, set-and-forget solution
|
|
60
|
+
|
|
61
|
+
- [fly.io](https://fly.io/)
|
|
62
|
+
- [kamal](https://kamal-deploy.org/) (you probably can't just forget this one)
|
|
63
|
+
|
|
64
|
+
## License
|
|
65
|
+
|
|
66
|
+
`fujin` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# fujin
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/fujin-cli)
|
|
4
|
+
[](https://pypi.org/project/fujin-cli)
|
|
5
|
+
[](https://github.com/falcopackages/fujin/blob/main/LICENSE.txt)
|
|
6
|
+
[](https://pypi.org/project/fujin-cli)
|
|
7
|
+
-----
|
|
8
|
+
|
|
9
|
+
> [!IMPORTANT]
|
|
10
|
+
> This package currently contains minimal features and is a work-in-progress
|
|
11
|
+
|
|
12
|
+
`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
|
+
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
|
+
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
|
+
|
|
16
|
+
Check out the [documentation📚](https://fujin.readthedocs.io/en/latest/) for installation, features, and usage guides.
|
|
17
|
+
|
|
18
|
+
## Why?
|
|
19
|
+
|
|
20
|
+
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.
|
|
22
|
+
|
|
23
|
+
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
|
+
I'm currently rocking SQLite in production for my side projects and ths setup is enough for my use case.
|
|
25
|
+
|
|
26
|
+
The goal is to automate deployment while leaving you in full control of your Linux box. It's not a CLI PaaS - it's simple and expects you to be able to SSH into your server and troubleshoot if necessary. For beginners, it makes the initial deployment easier while you get your hands dirty with Linux.
|
|
27
|
+
If you need a never-break, worry-free, set-it-and-forget-it setup that auto-scales and does all the magic, fujin probably isn't for you.
|
|
28
|
+
|
|
29
|
+
## Inspiration and alternatives
|
|
30
|
+
|
|
31
|
+
Fujin draws inspiration from the following tools for their developer experience. These are better alternatives if you need a more robust, set-and-forget solution
|
|
32
|
+
|
|
33
|
+
- [fly.io](https://fly.io/)
|
|
34
|
+
- [kamal](https://kamal-deploy.org/) (you probably can't just forget this one)
|
|
35
|
+
|
|
36
|
+
## License
|
|
37
|
+
|
|
38
|
+
`fujin` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# -*- mode: ruby -*-
|
|
2
|
+
# vi: set ft=ruby :
|
|
3
|
+
|
|
4
|
+
# All Vagrant configuration is done below. The "2" in Vagrant.configure
|
|
5
|
+
# configures the configuration version (we support older styles for
|
|
6
|
+
# backwards compatibility). Please don't change it unless you know what
|
|
7
|
+
# you're doing.
|
|
8
|
+
Vagrant.configure("2") do |config|
|
|
9
|
+
# The most common configuration options are documented and commented below.
|
|
10
|
+
# For a complete reference, please see the online documentation at
|
|
11
|
+
# https://docs.vagrantup.com.
|
|
12
|
+
|
|
13
|
+
# Every Vagrant development environment requires a box. You can search for
|
|
14
|
+
# boxes at https://vagrantcloud.com/search.
|
|
15
|
+
config.vm.box = "hashicorp/bionic64"
|
|
16
|
+
# config.vm.box = "alvistack/ubuntu-24.04"
|
|
17
|
+
# config.vm.box_version = "20241002.1.1"
|
|
18
|
+
|
|
19
|
+
# Disable automatic box update checking. If you disable this, then
|
|
20
|
+
# boxes will only be checked for updates when the user runs
|
|
21
|
+
# `vagrant box outdated`. This is not recommended.
|
|
22
|
+
# config.vm.box_check_update = false
|
|
23
|
+
|
|
24
|
+
# Create a forwarded port mapping which allows access to a specific port
|
|
25
|
+
# within the machine from a port on the host machine. In the example below,
|
|
26
|
+
# accessing "localhost:8080" will access port 80 on the guest machine.
|
|
27
|
+
# NOTE: This will enable public access to the opened port
|
|
28
|
+
# config.vm.network "forwarded_port", guest: 80, host: 8080
|
|
29
|
+
|
|
30
|
+
# Create a forwarded port mapping which allows access to a specific port
|
|
31
|
+
# within the machine from a port on the host machine and only allow access
|
|
32
|
+
# via 127.0.0.1 to disable public access
|
|
33
|
+
# config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
|
|
34
|
+
|
|
35
|
+
# Create a private network, which allows host-only access to the machine
|
|
36
|
+
# using a specific IP.
|
|
37
|
+
# config.vm.network "private_network", ip: "192.168.33.10"
|
|
38
|
+
|
|
39
|
+
# Create a public network, which generally matched to bridged network.
|
|
40
|
+
# Bridged networks make the machine appear as another physical device on
|
|
41
|
+
# your network.
|
|
42
|
+
# config.vm.network "public_network"
|
|
43
|
+
|
|
44
|
+
# Share an additional folder to the guest VM. The first argument is
|
|
45
|
+
# the path on the host to the actual folder. The second argument is
|
|
46
|
+
# the path on the guest to mount the folder. And the optional third
|
|
47
|
+
# argument is a set of non-required options.
|
|
48
|
+
# config.vm.synced_folder "../data", "/vagrant_data"
|
|
49
|
+
|
|
50
|
+
# Disable the default share of the current code directory. Doing this
|
|
51
|
+
# provides improved isolation between the vagrant box and your host
|
|
52
|
+
# by making sure your Vagrantfile isn't accessible to the vagrant box.
|
|
53
|
+
# If you use this you may want to enable additional shared subfolders as
|
|
54
|
+
# shown above.
|
|
55
|
+
# config.vm.synced_folder ".", "/vagrant", disabled: true
|
|
56
|
+
|
|
57
|
+
# Provider-specific configuration so you can fine-tune various
|
|
58
|
+
# backing providers for Vagrant. These expose provider-specific options.
|
|
59
|
+
# Example for VirtualBox:
|
|
60
|
+
#
|
|
61
|
+
config.vm.provider "virtualbox" do |vb|
|
|
62
|
+
# # Display the VirtualBox GUI when booting the machine
|
|
63
|
+
# vb.gui = true
|
|
64
|
+
#
|
|
65
|
+
# # Customize the amount of memory on the VM:
|
|
66
|
+
vb.memory = "2024"
|
|
67
|
+
end
|
|
68
|
+
#
|
|
69
|
+
# View the documentation for the provider you are using for more
|
|
70
|
+
# information on available options.
|
|
71
|
+
|
|
72
|
+
# Enable provisioning with a shell script. Additional provisioners such as
|
|
73
|
+
# Ansible, Chef, Docker, Puppet and Salt are also available. Please see the
|
|
74
|
+
# documentation for more information about their specific syntax and use.
|
|
75
|
+
# config.vm.provision "shell", inline: <<-SHELL
|
|
76
|
+
# apt-get update
|
|
77
|
+
# apt-get install -y apache2
|
|
78
|
+
# SHELL
|
|
79
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
Commands
|
|
2
|
+
========
|
|
3
|
+
|
|
4
|
+
.. cappa:: fujin.__main__.Fujin
|
|
5
|
+
:style: terminal
|
|
6
|
+
:terminal-width: 0
|
|
7
|
+
|
|
8
|
+
.. toctree::
|
|
9
|
+
:maxdepth: 2
|
|
10
|
+
:hidden:
|
|
11
|
+
|
|
12
|
+
app
|
|
13
|
+
config
|
|
14
|
+
deploy
|
|
15
|
+
docs
|
|
16
|
+
down
|
|
17
|
+
init
|
|
18
|
+
prune
|
|
19
|
+
proxy
|
|
20
|
+
redeploy
|
|
21
|
+
rollback
|
|
22
|
+
secrets
|
|
23
|
+
server
|
|
24
|
+
up
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Configuration file for the Sphinx documentation builder.
|
|
2
|
+
#
|
|
3
|
+
# For the full list of built-in configuration values, see the documentation:
|
|
4
|
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
|
5
|
+
# -- Project information -----------------------------------------------------
|
|
6
|
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
|
|
7
|
+
|
|
8
|
+
project = "fujin"
|
|
9
|
+
copyright = "2024, Tobi DEGNON"
|
|
10
|
+
author = "Tobi DEGNON"
|
|
11
|
+
release = "2024"
|
|
12
|
+
|
|
13
|
+
# -- General configuration ---------------------------------------------------
|
|
14
|
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
|
|
15
|
+
|
|
16
|
+
extensions = [
|
|
17
|
+
"cappa.ext.docutils",
|
|
18
|
+
"myst_parser",
|
|
19
|
+
"sphinx.ext.todo",
|
|
20
|
+
"sphinx.ext.autodoc",
|
|
21
|
+
"sphinx_design",
|
|
22
|
+
"sphinx_copybutton",
|
|
23
|
+
"jupyter_sphinx",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
templates_path = ["_templates"]
|
|
27
|
+
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
|
|
28
|
+
|
|
29
|
+
# -- Options for HTML output -------------------------------------------------
|
|
30
|
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
|
|
31
|
+
|
|
32
|
+
html_theme = "shibuya"
|
|
33
|
+
html_static_path = ["_static"]
|
|
34
|
+
|
|
35
|
+
html_theme_options = {
|
|
36
|
+
"mastodon_url": "https://fosstodon.org/@tobide",
|
|
37
|
+
"github_url": "https://github.com/falcopackages/fujin",
|
|
38
|
+
"twitter_url": "https://twitter.com/tobidegnon",
|
|
39
|
+
"discussion_url": "https://github.com/falcopackages/fujin/discussions",
|
|
40
|
+
"accent_color": "teal",
|
|
41
|
+
"globaltoc_expand_depth": 1,
|
|
42
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
Configuration
|
|
2
|
+
=============
|
|
3
|
+
|
|
4
|
+
.. automodule:: fujin.config
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Example
|
|
8
|
+
-------
|
|
9
|
+
|
|
10
|
+
This is a minimal working example.
|
|
11
|
+
|
|
12
|
+
.. jupyter-execute::
|
|
13
|
+
:hide-code:
|
|
14
|
+
|
|
15
|
+
from fujin.commands.init import simple_config
|
|
16
|
+
from tomli_w import dumps
|
|
17
|
+
|
|
18
|
+
print(dumps(simple_config("bookstore")))
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
|
|
15
|
+
.. .. include:: ../README.md
|
|
16
|
+
:parser: myst_parser.sphinx_
|
|
17
|
+
|
|
18
|
+
.. toctree::
|
|
19
|
+
:maxdepth: 2
|
|
20
|
+
:caption: Contents:
|
|
21
|
+
:hidden:
|
|
22
|
+
|
|
23
|
+
installation
|
|
24
|
+
tutorial
|
|
25
|
+
configuration
|
|
26
|
+
commands/index
|
|
27
|
+
hooks
|
|
28
|
+
changelog
|
|
29
|
+
|